JAVA反射之 Field (屬性)
阿新 • • 發佈:2018-12-22
主要方法:
public static void main(String[] args) throws Exception { Class<?> clazz = Class.forName("Person"); //得到類中所有方法,返回一個數組 Field[] fileds = clazz.getFields(); //得到所有方法包括私有方法 Field[] fields2 = clazz.getDeclaredFields(); //得到方法 Field field = clazz.getDeclaredField("name");//暴力訪問,訪問私有屬性 field.setAccessible(true); //通過類例項化物件,通過呼叫類的無參構造器去例項化物件 Object object = clazz.newInstance(); //給物件屬性賦值 field.set(object, "hhh"); //物件型別 Class s = field.getType();//class java.lang.String System.out.println(s); //物件名稱 field.getName();//獲取物件屬性值 field.get("name"); }
暴力訪問會破壞物件的封裝性,解決方法為:
//破壞封裝性,解決方式(內省機制): Class<?> clazz1 = Class.forName("Person"); // 建立物件 Object person = clazz1.newInstance(); // 獲得屬性描述器 PropertyDescriptor propertyDescriptor = new PropertyDescriptor("setName", clazz1);// 獲得set方法 Method setMethod = propertyDescriptor.getWriteMethod(); // 呼叫方法 person.setName("jack"); setMethod.invoke(person, "jack"); System.out.println(person);