Class
まず、.class ファイルをオブジェクトに変換する必要があります。でこれを行うことができますURLClassLoader
。
aFile classFile
と aがあるとしString className
ます。
try {
URLClassLoader classLoader = new URLClassLoader(new URL[]{classFile.toURI().toURL()});
Class<?> clazz = classLoader.loadClass(className);
} catch (Exception e) {
// something went wrong..
e.printStackTrace();
}
これでクラス ファイルがClass
オブジェクトに格納されましたが、そのタイプのオブジェクトを作成し、そこからメソッドを呼び出すにはどうすればよいでしょうか。 この状況では、パッケージのJava リフレクションjava.lang.reflect
が役立ちます。
Class<?>
オブジェクトが 、メソッド名の 、およびメソッド引数のという名前clazz
の変数に格納されていると仮定しましょう。String methodName
String toSet
try {
Object instance = clazz.newInstance();
Method method = clazz.getDeclaredMethod(methodName, String.class);
method.setAccessible(true);
method.invoke(instance, toSet);
} catch (Exception e) {
// something went wrong..
e.printStackTrace();
}
メソッド名が不明な場合は、それを識別する方法を作成する必要があることに注意してください。これは、リフレクションを介して行うことができますが、バイトコード注入/変更/分析ライブラリを使用してメソッドのバイトコードをチェックすることにより、より安定して行われます。ASMまたはBCELとして。BCEL は 2006 年以来更新されていませんが、個人的な意見としては、BCEL の方が使い方を習得しやすいということです。ただし、ASM ははるかに高速で最新です。