2010-12-02 15 views
5

チェック例外をスローするはずのメソッドのバイトコードを記述することが可能な場合は、 (Scalaはチェック例外を持っていないため)次のScala相当しますがスカラで生成されたバイトコードは、チェックされた例外をどのように落としますか?

public class CheckedExceptionJava { 
    public Class<?> testChecked(String s) throws ClassNotFoundException { 
    return Class.forName(s); 
    } 
} 

方法は、それがチェック例外をスロー宣言しない限り、

たとえば、次のJavaクラスがコンパイルされません。

class CheckedException { 
    def testChecked(s : String) = Class.forName(s) 
} 

生成されたバイトコードはほぼ同じであったとしても:

Compiled from "CheckedExceptionJava.java" 
public class CheckedExceptionJava extends java.lang.Object{ 
public CheckedExceptionJava(); 
    Code: 
    0: aload_0 
    1: invokespecial #1; //Method java/lang/Object."<init>":()V 
    4: return 

public java.lang.Class testChecked(java.lang.String) throws java.lang.ClassNotFoundException; 
    Code: 
    0: aload_1 
    1: invokestatic #2; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class; 
    4: areturn 

} 

Compiled from "CheckedException.scala" 
public class CheckedException extends java.lang.Object implements scala.ScalaObject{ 
public CheckedException(); 
    Code: 
    0: aload_0 
    1: invokespecial #24; //Method java/lang/Object."<init>":()V 
    4: return 

public java.lang.Class testChecked(java.lang.String); 
    Code: 
    0: aload_1 
    1: invokestatic #11; //Method java/lang/Class.forName:(Ljava/lang/String;)Ljava/lang/Class; 
    4: areturn 

} 

質問:そのメソッド内のコードがそれを処理しないとしてもチェックされた例外をスローすることはできませんが、バイトコードを生成することは可能ですか(どのように)できますか?

答えて

13

シンプルです。 JVMバイトコードにはメソッドのチェック例外仕様が含まれていますが、バイトコードが実行される前に実行されるバイトコード検証機能は、メソッドが実際に例外仕様に準拠しているかどうかをチェックしません。既存のJVMバイトコードを使用し、すべての例外仕様を削除したプログラムを書くことができます。結果のバイトコードは完全に有効で、元のものと同じように実行されます(反映の禁止)。

+0

わかりました。おそらくjavassistのようなツールを使っていますか? :) http://bit.ly/gNzXfA – OscarRyz

関連する問題