簡體   English   中英

Java通過Reflection訪問私有屬性

[英]Java accessing private property via Reflection

我有以下包結構和類。

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異常。

我試過也直接到達fieldX。 但是這次我得到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));

Class.getMethod調用僅適用於公共方法。 您需要使用Class.getDeclaredMethod調用,然后將Method.setAccessible屬性設置為true:

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

編輯:由於在ClassA上聲明了getFieldX方法,因此需要從ClassA而不是ClassC中獲取Method。 getMethod調用相反, getDeclaredMethod調用忽略超類

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM