image.png
一眼望不到頭的隔壁灘,還有站在山頭望著那邊的山頭叶摄,山那邊的山是什么樣的属韧,很明顯不得而知,而我的思緒卻早已飛到了山那邊的山蛤吓,抬頭便是晴空萬里宵喂,白天哼著小曲,放著羊会傲,夕陽西下的場景锅棕,不知不覺得浮現(xiàn)出小時候的場景,記得那時淌山,晚飯過后裸燎,躺在父親的懷里,一顆星星泼疑、二顆德绿、三顆......咳咳,思緒又回來了退渗,了解完method我們來看看filed(字段)移稳,那么如何獲取filed?
獲取Filed的方式:
> 1.public Filed[] getFileds();表示返回該對象字節(jié)碼所表示類的能夠訪問的所有公共字段会油。
2.public Filed[] getDeclaredFileds();表示返回該字節(jié)碼對象所表示類的所有字段(沒有訪問權(quán)限的限制)个粱,代碼如下:
代碼示例:
class Teacher{
public String name;
private int id;
private int age;
public Teacher(String name, int id, int age) {
this.name = name;
this.id = id;
this.age = age;
}
public Teacher() {
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
為了能夠更好地理解,在這里我寫了一個Teacher類翻翩,我們接著來看:
代碼示例:
private static void getAllField(){
獲取該字段所對應(yīng)類的字節(jié)碼
Class<Teacher> clazz = Teacher.class;
獲取所有的公共的字段
Field[] fields = clazz.getFields();
System.out.println(fields.length);
for (Field f:fields) {
System.out.println(f);
}
System.out.println("=============================");
獲取所有的字段都许,與訪問權(quán)限無關(guān)
fields = clazz.getDeclaredFields();
System.out.println(fields.length);
for (Field f1:fields) {
System.out.println(f1);
}
}
測試結(jié)果如下:
QQ截圖20180505205741.png
由上圖可知,我們拿到了該類的所有字段梭稚,上面我們只是拿到了所有的字段,在實際中我們可能只需要其中某一個絮吵,所以不必要都拿到,通過API我們可以發(fā)現(xiàn),我們可以單獨的拿到我們想要的那個字段暇昂,直接上代碼:
> 1.public Filed getFiled(String name);表示返回一個Filed對象,而且是一個公共的可訪問的字段急波,參數(shù):name表示字段名。
2.public Filed getDeclaredFiled(String name);表示返回一個Filed對象澄暮,與訪問權(quán)限無關(guān)
代碼示例:
獲取單個字段
private static void getOneField()throws Exception{
Teacher th = new Teacher();
th.setName("張三");
th.setAge(18);
th.setId(1001);
Class<Teacher> clazz = Teacher.class;
獲取修飾符為公共的字段
Field field = clazz.getField("name");
給該字段設(shè)置新值
field.set(th,"哈哈");
System.out.println( field.get(th));
返回該字段的修飾符
System.out.println(field.getModifiers());
返回該字段名稱
System.out.println(field.getName());
System.out.println(field.toString());
System.out.println("===================");
獲取修飾符私有的字段
private int id
獲取該字段,與訪問權(quán)限無關(guān)
field = clazz.getDeclaredField("id");
設(shè)置允許訪問私有的字段
field.setAccessible(true);
設(shè)置新的值
field.set(th,1111);
System.out.println(field.get(th));
System.out.println(field.getName());
System.out.println(field.getModifiers());
System.out.println(field.toString());
返回該字段的聲明類型
System.out.println(field.getType());
System.out.println("=====================");
獲取該 private int age
field = clazz.getDeclaredField("age");
field.setAccessible(true);
field.set(th,60);
System.out.println(field.get(th));
System.out.println(field.getName());
System.out.println(field.getModifiers());
System.out.println(field.toString());
}
從代碼中我們得知泣懊,通過get(Object obj)獲取屬性的值,通過set(Object obj,value)重新設(shè)置新的屬性值馍刮,并且當(dāng)我們需要獲取私有屬性的屬性值得時候信夫,我們必須設(shè)置Accessible為true,然后才能獲取卡啰。
測試結(jié)果:
QQ截圖20180505212409.png
關(guān)于反射的常見操作基本都在這里静稻,總之了,多多練習(xí)匈辱,有句話說得好振湾,多讀源代碼,對身體好梅誓,老鐵們你們懂得了G∩摇!9j嵌言!