まず、.classファイルをClass
オブジェクトに変換する必要があります。 URLClassLoader
でこれを行うことができます。
File classFile
と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.lang.reflect
パッケージのJava reflectionが便利です。
は、あなたがあなたの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年以来更新されていませんが、使用方法を学ぶ方が簡単だという私の個人的意見です。ただし、ASMははるかに高速であり、最新の状態です。
これを継続的に行う必要がありますか? Bhavikが示唆するようにそれを逆コンパイルできますか?それとも、あなたが別の「未知の」クラスに何度も何度もやらなければならないことです。なぜあなたのクラスの詳細が分からないのですか?これらのクラスはどこから来たのですか? –
+1グレッグ、これらのクラスはどこから来たのですか?それについて何も知らないのであれば、なぜそれを使いたいのですか? ;) – Nishant
あなたの返事をありがとう。ああ、それは単なる割り当てです....教授はそうするように私たちに求めます。 –