2011-07-12 6 views
6

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

私はフィールドを取得することができましたが、私はそのフィールドを読み書きできません。

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

問題は、私が実行しているjarファイルからクラスを使用することで、私が操作しようとするクラスがクラスローダから取得されています。これは私がウェブ上で発見例です。だから '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 

感謝。

+0

「実行中のjarファイル」とはどういう意味ですか?あなたのクラスパスにありますか? – wjans

答えて

0

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

Field.getのJavaDocを見ると、Field.getの引数は、Classオブジェクトではなくフィールドを読み取ろうとしているオブジェクトインスタンスである必要があります。したがって、それは次のようなものでなければなりません:

Object value = field.get(someInstanceOfTheLoadedClass); 

あなたはタイプintの型の項目に何かを割り当てようとしているようです。 intフィールドを設定するには、Field.setIntを使用する必要があります。

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

+0

...または 'myObject.getClass()'を使用します。 –

2

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

Class = objectInstance.getClass(); 

はまた、他のポスターは、あなたが言ったように:あなたは、コンパイル時間の使用で、種類がわからない場合は

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); 
0

は、これらのオプションを試すことができます classからインスタンスを取得するにはフィールドのタイプを知り、それに応じて正しいタイプを使用する必要があります。

このランタイムを使用するには、Field.getType()を使用し、その後に正しいgetterおよびsetterを使用します。

3

これは役立つはずです:ドキュメントから

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); 
2

: java.lang.IllegalArgumentExceptionががスローされます。

If, after possible unwrapping, the new value cannot be converted to the type of the underlying field by an identity or widening conversion, the method throws an IllegalArgumentException.

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

Class aClass = Class.forName("fullyQualifiedMyObjectClassName.e.g.com.bla.bla.MyObject"); 
0

は、この作業を行います:

無関係では、あなたのコードを見て、私は

Class aClass = MyObject.class; 

作品への変更でしょうか?

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);