關於java'反射機制,獲得類的所有方法與字段

在java的反射機制中,今天在看視頻講解如何獲取一個類的所有方法和字段,看完覺得一頭霧水,就半懂半不懂的去做實驗。可老出錯誤,感覺沒什麼錯啊。

測試類FieldTest.java

import java.lang.reflect.Field;




public class FieldTest {


public static void main(String[] args) throws Exception {
Helper helper=new Helper();
changeStringValue(helper);
System.out.println(helper);
}
public  static void changeStringValue(Object obj) throws Exception{
// TODO Auto-generated method stub
Field[] fields =obj.getClass().getFields();
for(Field field:fields){
if(field.getType()==String.class){
String str1=(String)field.get(obj);
String str2=str1.replace('f', 'c');
field.set(obj, str2);
}
}
}


}

輔助類 Helper.java

public class Helper {


String test1="onebyone";
String test2="twobytwo";
String test3="threeorthree";

@Override
public String toString() {
return "Helper [test1=" + test1 + ", test2=" + test2 + ", test3="
+ test3 + "]";
}

}

結果:

Helper [test1=onebyone, test2=twobytwo, test3=threeorthree]

結果在編譯執行都沒問題,可並沒有改變輔助類裏面String的值,我很鬱悶怎麼回事,我就debug一下,發現fields.length的值是0,我不是已經查詢所有的字段了嗎,怎麼還回0呢?沒有思路了,後來一想發現,你要想訪問輔助類裏面的字段時,他們的類型一定是public類型的,否則輔助類的字段是不可見的。所以把輔助類裏面的String前面加上public局可以了

結果:

Helper [test1=znebyzne, test2=twzbytwz, test3=threezrthree]

其實還有一種解決方法就在獲取時強制獲取,用方法.getDeclaredFields()進行強制訪問,然而這纔是你能訪問,要想使用一定要設置Field對象可用,方法setAccessible(true);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章