通過反射修改指定物件欄位值的通用方法
阿新 • • 發佈:2019-01-26
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; } }