欄位的擷取與前面構造方法和行為方法差不多;思路一樣
package javaInvokeFiled;
import java.lang.reflect.Field;
/**
* 反射擷取欄位
* @author Administrator
*
*/
class Filed{
public String name;
private int age;
private int number;
public String password;
public Filed(){
}
}
public class InvokeFiled {
/**
* 擷取欄位方法和前面擷取構造器和方法大同小異。getFileds():擷取所有Public修飾的欄位以及繼承自父類的欄位 規則與擷取構造和方法大同小異
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
Class claz = Filed.class;
Class claz1=Class.forName("javaInvokeFiled.Filed");
Field[] fields= claz.getFields();
for(Field field:fields){
System.out.println("擷取所有的public及繼承的欄位"+field);
}
Field[] fieldsDecrs=claz.getDeclaredFields();
for(Field fieldDecr:fieldsDecrs){
System.out.println("擷取所有的欄位包括private/public,但不包括繼承的欄位"+fieldDecr);
}
/*擷取指定的欄位:參數傳欄位名稱*/
Field field1=claz.getField("name");
System.out.println("擷取指定的public欄位"+field1);
/*擷取指定的私人欄位*/
Field fieldP = claz.getDeclaredField("number");
System.out.println("擷取指定的私人欄位:"+fieldP);
/**
*為欄位設值:setxxx(obj,基本類型資料)基本類型欄位設值; set(obj,參考型別資料) 參考型別設值 obj為欄位所在底層對象 如果是靜態欄位則obj可以為NULL
*/
/*給欄位設定值*/
field1.set(claz.newInstance(), "張飛");
System.out.println(field1.get(claz.newInstance()));
/*給私人欄位設定值*/
fieldP.setAccessible(true);
fieldP.setInt(claz.newInstance(), 12);
System.out.println(fieldP.getInt(claz.newInstance()));
/**
* 擷取欄位值 :getxxx(obj) get(obj) 如果欄位為static修飾則obj可以為null
*/
/*擷取私人靜態欄位的值*/
Field fieldd = claz.getDeclaredField("str");
fieldd.setAccessible(true);
System.out.println(fieldd.get(null)+"******私人靜態參考型別");
/*擷取私人的欄位的值*/
Field fieldnum=claz.getDeclaredField("num");
fieldnum.setAccessible(true);
System.out.println(fieldnum.getInt(claz.newInstance())+"******私人基本類型");
}
}