1、什么是反射?有什么優缺點?
反射就是動態加載對象,並對對象進行剖析。在運行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法。對於任意一個對象,都能夠調用它的任意一個方法。這種動態獲取信息以及動態調用對象方法的功能稱為java反射機制。
優點:反射可以動態創建對象和編譯,最大限度發揮了java的靈活性。
缺點:對性能有影響。反射基本上是一種解釋操作,告訴JVM我們要做什么並且滿足我們的需求,這類操作總是慢於直接執行java代碼。
2、如何使用反射?
a:通過一個全限定類名創建一個對象
Class<?> clz = Class.forname("全限類名");
Class<?> clz = A.class;
Class<?> clz = b.getClass();
b:獲取構造器對象,通過構造器new出一個對象
Constructor<?> cons = clz.getConstructor([參數類型class]);
cons.newInstance([參數]);
c:通過class對象創建一個實例(就相當於new 類名()無參構造器)
clz.newInstance();
d:通過class對象獲得一個屬性對象
Field[] fields = clz .getFields();//獲得某個類的所有的公共(public)的字段,包括父類中的字段。
Field[] fields = clz .getDeclaredFields();//獲得某個類的所有聲明的字段,即包括public、private和proteced,但是不包括父類的申明字段
e:通過class對象獲得一個方法對象
Method m = clz.getMethod("方法名",參數class);//只能獲取公共的
Method m = clz.getDeclaredMethod("方法名",參數class);//獲取任意修飾的方法,不能執行私有
m.setAccessible(true);//讓私有的方法可以執行
f:讓方法執行
m.invoke(obj實例對象,obj可變參數)