Java反射的簡單實現
阿新 • • 發佈:2018-11-16
一.Java的反射機制概述與場景
JAVA反射機制是在執行狀態中,對於任意一個類(class檔案),都能夠知道這個類的所有屬性和方法;
對於任意一個物件,都能夠呼叫它的任意一個方法和屬性;
這種動態互毆的資訊以及動態呼叫物件的方法的功能稱為java語言的反射機制
場景:tomcat中伺服器web.xml類檔案由反射進行載入
二.反射機制細節&class物件
獲得位元組碼物件的幾種方式
方式1:使用物件獲得 根據被new的累的名稱尋找累的位元組碼檔案,並載入進記憶體,並建立該位元組碼檔案對選哪個,並接著建立蓋子接檔案的對應的person物件
Person person = new Person();
Class class1 = person.getClass();
方式2:使用類獲得
Class class3 = Person.class;
方式3:使用名稱獲得
try { Class<?> forName = Class.forName("Person"); System.out.println(forName); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); }
三.建立物件
1.newInstance,相當於呼叫無參構造方法,注意:當無空參構造方法或者物件為private空參構造時,會報錯
Object newInstance = forName.newInstance();
2.獲取指定的建構函式
Class<?> forName = Class.forName("Person"); Constructor<?> constructor = forName.getConstructor(Integer.class,String.class); Object obj = constructor.newInstance(1,"小明");
四.獲取屬性
1.獲得公有屬性
Class<?> forName = Class.forName("Person");
Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
Object obj = constructor.newInstance(1,"小明");
Field field = forName.getField("c");
Object object = field.get(obj);
2.獲得私有的屬性
Class<?> forName = Class.forName("Person");
Constructor<?> constructor = forName.getConstructor(Integer.class,String.class);
Object obj = constructor.newInstance(1,"小明");
Field declaredField = forName.getDeclaredField("a");
declaredField.setAccessible(true);
System.out.println(declaredField.get(obj));
注意:必須要取消許可權檢查才能訪問暴力訪問,不建議使用
五.獲取方法
1.獲得位元組物件所有的公有方法名稱
Class<?> forName = Class.forName("Person");
Method[] methods = forName.getMethods();
2.呼叫方法
Class<?> forName = Class.forName("Person");
Method method = forName.getMethod("方法名稱",null);
method.invoke("我們的實體類", "引數");