反射-通過反射獲取成員變數並使用

ZHOU_VIP發表於2017-06-11

package cn.itcast_03;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;

/*
 * 通過發生獲取成員變數並使用
 */
public class ReflectDemo {
	public static void main(String[] args) throws Exception {
		// 獲取位元組碼檔案物件
		Class c = Class.forName("cn.itcast_01.Person");

		// 獲取公共(public修飾)的成員變數
		// Field[] fields = c.getFields();
		// 獲取所有的成員變數
		// Field[] fields = c.getDeclaredFields();
		// for (Field field : fields) {
		//   System.out.println(field);
		// }


		// 通過無參構造方法建立物件
		Constructor con = c.getConstructor();
		Object obj = con.newInstance();

		// 獲取單個的成員變數
		// 獲取address並對其賦值,public String address; 
		Field addressField = c.getField("address");
		
		// public void set(Object obj,Object value)
		// 將指定物件變數上此Field物件表示的欄位設定為指定的新值。
		addressField.set(obj, "北京"); // 給obj物件的addressField欄位設定值為"北京"
		System.out.println(obj);

		// 獲取name並對其賦值,name是private修飾的,private String name; 
		// getField,報錯NoSuchFieldException,改成getDeclaredField
		Field nameField = c.getDeclaredField("name");
		nameField.setAccessible(true);
		nameField.set(obj, "林青霞");
		System.out.println(obj);

		// 獲取age並對其賦值,int age; 
		Field ageField = c.getDeclaredField("age");
		ageField.setAccessible(true);
		ageField.set(obj, 27);
		System.out.println(obj);
	}
}


相關文章