2011-02-08 8 views
8

私は以下のパッケージ構造とクラスを持っています。Javaがリフレクションによるプライベートプロパティにアクセス

package X 
    Class A 
     private string fieldX; 
     protected string getFieldX(){ return fieldX}; 

package Y 
    Class B extends A 
    Class C extends B 

私はClassCオブジェクトを持っており、リフレクションによってfieldXを取得しようとしています。

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassC.class.getMethod("getFieldX",partypes); 
String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

しかし、私はNoSuchMethod例外を取得しています。

フィールドXにも直接触れました。しかし今回はNoSuchField Exceptionを取得しています。

Field reqField = ClassC.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
Object value = reqField.get(classCInstance); 
String retValue = (string) value; 

私が間違っていることは何ですか? ClassCオブジェクトからこのfieldXを取得する方法はありますか?

解決策:(ソリューションにはおかげさまでvz0);

民間分野へのダイレクトアクセス:

Field reqField = ClassA.class.getDeclaredField("fieldX"); 
reqField.setAccessible(true); 
String value = (String)reqField.get(clazzc); 

メソッド呼び出し。

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 
getContextMethod.setAccessible(true); 
System.out.println((String)getContextMethod.invoke(clazzc, arglist)); 

答えて

12

Class.getMethodコールはパブリックメソッドのみです。あなたはClass.getDeclaredMethodコールを使用する必要があり、その後、trueにMethod.setAccessibleプロパティを設定:

Class partypes[] = new Class[0]; 
Object arglist[] = new Object[0]; 
Method getContextMethod = ClassA.class.getDeclaredMethod("getFieldX",partypes); 

getContextMethod.setAccessible(true); 

String retValue = (string) getContextMethod.invoke(classCInstance, arglist); 

EDIT:getFieldX方法はClassAに宣言されているので、あなたはにClassAとないクラスCからメソッドを取得する必要があります。 getMethodコールとは逆に、getDeclaredMethodignores superclassesとなります。

+0

メソッドが 'ClassC'で宣言されていないので、これは機能しません。 – BalusC

+0

編集済みです。 – vz0

+0

明確化が加えられました。 – vz0

関連する問題