1

私は .class ファイルを持っていますが、クラス名、フィールド、メソッドなど、.class ファイルについて何も知りません。私がしなければならないことは、クラスに関するすべてを見つけ出し、クラスのオブジェクトをインスタンス化することです。

.class ファイルの内部については何も知らないことを思い出してください。変数 str およびパラメーターなしの純粋なコンストラクターに。

問題は、オブジェクトをインスタンス化し、メソッドを呼び出して String を str に割り当てる方法です。クラスまたはメソッドの宣言が同じファイルにある場合の方法は知っていますが、これは未知の .class ファイルです。皆さんに助けを求めます。

4

4 に答える 4

4

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 methodNameString 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 ははるかに高速で最新です。

于 2012-05-10T05:04:09.213 に答える
0

その .class ファイルを Java ファイルに変換できます。つまり、JAD を使用して逆コンパイルし、Java ファイルのソースを知ることができます。

このリソースを利用できるほか、Google でさらに多くのリソースを見つけることができます。

于 2012-05-10T04:52:52.550 に答える
0

このチュートリアルを進めるだけで、すべての答えが得られます..

Java リフレクションの使用

リフレクションは Java プログラミング言語の機能です。これにより、実行中の Java プログラムはそれ自体を調べたり、「イントロスペクト」したり、プログラムの内部プロパティを操作したりできます。たとえば、Java クラスはそのすべてのメンバーの名前を取得して表示することができます。

于 2012-05-10T04:55:23.097 に答える
0

.class ファイルがある場合は、独自の ClassLoader を記述し、defineClass を使用して Class インスタンスを作成できます。そこから、名前とコンストラクターを取得できます。null コンストラクターがある場合は、単純に Class インスタンスで newInstance を実行します。それ以外の場合は、コンストラクターを探し出して、適切な引数をコンストラクターの newInstance メソッドに渡す必要があります。

于 2012-05-10T04:58:29.813 に答える