5

チェックされた例外をスローすることになっているメソッドのバイトコードを書くことが可能であれば?

たとえば、次のJavaクラスは、チェックされた例外をスローすることをメソッドが宣言しない限り、コンパイルされません。

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

次のScalaの同等物はそうですが(Scalaは例外をチェックしていないため):

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

}

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

4

1 に答える 1

14

単純。JVMバイトコードにはメソッドのチェックされた例外仕様が含まれていますが、バイトコードが実行される前に実行されるバイトコードベリファイアは、メソッドが実際に例外仕様に準拠しているかどうかを特にチェックしません。既存のJVMバイトコードを取得し、すべての例外仕様を削除するプログラムを作成すると、結果のバイトコードは完全に有効になり、元のバイトコードと同じように実行されます(リフレクションを除く)。

于 2010-12-02T16:31:40.437 に答える