9

私は、リフレクションを使用して実行中のJavaアプリケーションのフィールドを取得するプロジェクトに取り組んでいます。

なんとかフィールドを取得できましたが、読み取りも書き込みもできません。これは私がウェブ上で見つけた例です:

Class aClass = MyObject.class
Field field = aClass.getField("someField");
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
field.set(objetInstance, value);

問題は、実行中のjarファイルのクラスを使用していて、操作しようとしているクラスがclassLoaderから取得されていることです。したがって、「MyObject.class」の代わりに「.class」があります。'MyObject'を取得するために、ClassLoaderを使用しようとしましたが、機能しませんでした。

'.class'を使用する場合:

Object value = field.get(theLoadedClass);

このエラーが発生します:

java.lang.IllegalArgumentException: Can not set int field myClass.field to java.lang.Class

ありがとう。

4

6 に答える 6

5

これは役立つはずです:

Class aClass = myClassLoader.loadClass("MyObject"); // use your class loader and fully qualified class name
Field field = aClass.getField("someField");
// you can not use "MyObject objectInstance = new MyObject()" since its class would be loaded by a different classloader to the one used to obtain "aClass"
// instead, use "newInstance()" method of the class
Object objectInstance = aClass.newInstance();
Object value = field.get(objectInstance);
field.set(objetInstance, value);
于 2011-07-12T07:24:09.333 に答える
2

ドキュメントから: java.lang.IllegalArgumentException がスローされます:

アンラップの可能性がある後、恒等変換または拡大変換によって新しい値を基になるフィールドの型に変換できない場合、メソッドは IllegalArgumentException をスローします。

これは、フィールドに設定しようとしているオブジェクト タイプ (オブジェクト) を実際のタイプに変換できないことを意味します。そこでオブジェクトを使用しないようにしてください。

無関係、あなたのコードを見て、私は変更します

Class aClass = MyObject.class; 

分割する:

Class aClass = Class.forName("fullyQualifiedMyObjectClassName.e.g.com.bla.bla.MyObject");
于 2011-07-12T07:28:40.147 に答える
2

field.get/set メソッドに渡すには、適切なクラスのインスタンスが必要です。

からインスタンスを取得するには、class次のオプションを試すことができます。

Class<?> clazz = MyObject.class;
// How to call the default constructor from the class:
MyObject myObject1 = clazz.newInstance(); 
// Example of calling a custom constructor from the class:
MyObject myObject2 = clazz.getConstructor(String.class, Integer.class).newInstance("foo", 1); 
于 2011-07-12T07:19:54.147 に答える
0

あなたの質問はあまり明確ではありませんが、リフレクションを使用してオブジェクトからフィールドの値を読み取る方法を尋ねていると思います。

Field.get の JavaDoc を見ると、Field.get への引数は、フィールドを読み取ろうとしているオブジェクト インスタンス (Class オブジェクトではない) であることがわかります。したがって、次のようになります。

Object value = field.get(someInstanceOfTheLoadedClass);

エラーは、Class 型のものを int 型のフィールドに代入しようとした結果のようです。int フィールドを設定するにはField.setIntを使用する必要があります。

.class を使用して Class オブジェクトを取得するか、Class.forName を使用して取得するかは問題ではありません。

于 2011-07-12T07:17:46.880 に答える
0

コンパイル時にタイプがわからない場合は、次を使用します。

Class = objectInstance.getClass();

また、他のポスターが言ったように、フィールドのタイプを知り、それに応じて正しいタイプを使用する必要があります。

このランタイムを決定するには、Field.getType() を使用し、その後、正しいゲッターとセッターを使用します。

于 2011-07-12T07:21:21.687 に答える
0

これは機能しますか?

Class aClass = MyObject.class;
Field field = aClass.getDeclaredField("someField");
field.setAccessible(true);
MyObject objectInstance = new MyObject();
Object value = field.get(objectInstance);
field.set(objectInstance, value);
于 2011-07-12T11:57:08.193 に答える