通過反射修改指定對象字段值的通用方法

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;
	}
}

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