super()
コンストラクターのバイトコードを分析して、コードがどこで終わるかを判断するための明白で迅速な方法があるかどうか疑問に思いました。
より具体的には、コンストラクターメソッドへのコンストラクターの呼び出しがオプションである(または、存在しない場合は暗黙的に)Javaとは対照的にsuper()
、バイトコードの世界では常に必要です。
黒魔術の目的のために、私はバイトコード分析と利用可能な最も単純な方法によってINVOKESPECIAL
、Javaの世界のsuper()
呼び出しに対応する呼び出しが何であるかを知る必要があります。
難しい例をここに残しておきます。
public static class A {
public A(Object o, Object b) {
}
}
public static class B extends A {
public B() {
//the below super is in bold just to signal that's the one
//I'm looking for
SUPER(new A(new Object(), new Integer(2)), new Integer(1));
System.out.println(new A(new Object(), new Integer(2)));
}
}
対応するバイトコードで: