1. 程式人生 > >通過反射修改指定物件欄位值的通用方法

通過反射修改指定物件欄位值的通用方法

package question5;

import java.lang.reflect.Field;

/*
 * 第五題
 * 寫一個方法,public void setProperty(Object obj, String propertyName, Object value){},
 * 此方法可將obj物件中名為propertyName的屬性的值設定為value。
 * 
 * 
 */
public class SetObjectProperty
{
	public static void main(String[] args) throws Exception
	{
		A obj = new A();
		//將物件中的a變數賦值為5,預設為0
		setProperty(obj, "a", 5);
		//輸出a的值
		System.out.println(obj.a);
		//將物件中的b變數賦值為10.預設為5
		setNotAccessibleProperty(obj, "b", 10);
		//輸出b的值
		System.out.println(obj.b);
	}
	
	/**
	 * 對給定物件obj的propertyName指定的成員變數進行賦值
	 * 賦值為value所指定的值
	 * 
	 * 該方法不能訪問私有成員
	 */
	public static void setProperty(Object obj, String propertyName, Object value) throws Exception
	{
		Class<?> clazz = obj.getClass();
		Field field = clazz.getField(propertyName);
		field.set(obj, value);
	}
	
	/**
	 * 對給定物件obj的propertyName指定的成員變數進行賦值
	 * 賦值為value所指定的值
	 * 
	 * 該方法可以訪問私有成員
	 */
	public static void setNotAccessibleProperty(Object obj, String propertyName, Object value) throws Exception
	{
		Class<?> clazz = obj.getClass();
		Field field = clazz.getDeclaredField(propertyName);
		//賦值前將該成員變數的訪問許可權開啟
		field.setAccessible(true);
		field.set(obj, value);
		//賦值後將該成員變數的訪問許可權關閉
		field.setAccessible(false);
	}
	
	//用來測試的類
	public static class A
	{
		public int a = 0;
		private int b = 5;
	}
}