クラスのソースコードから形成されたバイトコードからクラス名を掘り出すことは可能ですか?
状況は次のとおりです。クラスのバイトコードをどこかからリモートで取得します。それがどこから来たかは問題ではありません。そのクラスをクラスローダーで効果的にロードするには、クラス名も必要です...そうですか?
クラスのソースコードから形成されたバイトコードからクラス名を掘り出すことは可能ですか?
状況は次のとおりです。クラスのバイトコードをどこかからリモートで取得します。それがどこから来たかは問題ではありません。そのクラスをクラスローダーで効果的にロードするには、クラス名も必要です...そうですか?
最も簡単な方法は、おそらくASMのようなものを使用することです:
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.commons.EmptyVisitor;
public class PrintClassName {
public static void main(String[] args) throws IOException {
class ClassNamePrinter extends EmptyVisitor {
@Override
public void visit(int version, int access, String name, String signature,
String superName, String[] interfaces) {
System.out.println("Class name: " + name);
}
}
InputStream binary = new FileInputStream(args[0]);
try {
ClassReader reader = new ClassReader(binary);
reader.accept(new ClassNamePrinter(), 0);
} finally {
binary.close();
}
}
}
サードパーティのライブラリを使用できない場合は、クラス ファイル形式を自分で読み取ることができます。
javap
たまに発生する場合は、バイトコードを逆アセンブルするために使用できるはずです。
実行時に実行するには、Apache の BCEL ( http://jakarta.apache.org/bcel ) などのバイトコード操作ライブラリを使用して、バイト コードを分析します。
ClassLoader のサブクラスで ClassLoader.defineClass メソッドを使用して、特定のバイトコードの Class オブジェクトを取得できると思います。(未検証)