反射就是指程序在運行的時候能夠知道一個類的自身信息。編程
自身信息有哪些:類方法、屬性、成員變量、構造方法、包等框架
靜態編譯:在編譯的時候進肯定類型,若是綁定對象成功,new 是靜態加載類,就編譯經過。函數
ClassA classA = new ClassA();
動態編譯:在運行的時候肯定類型,綁定對象。最大發揮了Java的多態,下降類之間的耦合性。spa
Class c = Class.forName("ClassA");
ClassA classA = (ClassA) c.newInstance();
public Method getDeclaredMethod(String name, Class<?>... parameterTypes) // 獲得該類全部的方法,不包括父類的 public Method getMethod(String name, Class<?>... parameterTypes) // 獲得該類全部的public方法,包括父類的 //具體使用 Method[] methods = class1.getDeclaredMethods();//獲取class對象的全部聲明方法 Method[] allMethods = class1.getMethods();//獲取class對象的全部public方法 包括父類的方法 Method method = class1.getMethod("info", String.class);//返回次Class對象對應類的、帶指定形參列表的public方法 Method declaredMethod = class1.getDeclaredMethod("info", String.class);//返回次Class對象對應類的、帶指定形參列表的方法 public Field getDeclaredField(String name) // 得到該類自身聲明的全部變量,不包括其父類的變量 public Field getField(String name) // 得到該類自全部的public成員變量,包括其父類變量 //具體實現 Field[] allFields = class1.getDeclaredFields();//獲取class對象的全部屬性 Field[] publicFields = class1.getFields();//獲取class對象的public屬性 Field ageField = class1.getDeclaredField("age");//獲取class指定屬性 Field desField = class1.getField("des");//獲取class指定的public屬性 public Constructor<T> getDeclaredConstructor(Class<?>... parameterTypes) // 得到該類全部的構造器,不包括其父類的構造器 public Constructor<T> getConstructor(Class<?>... parameterTypes) // 得到該類因此public構造器,包括父類 //具體 Constructor<?>[] allConstructors = class1.getDeclaredConstructors();//獲取class對象的全部聲明構造函數 Constructor<?>[] publicConstructors = class1.getConstructors();//獲取class對象public構造函數 Constructor<?> constructor = class1.getDeclaredConstructor(String.class);//獲取指定聲明構造函數 Constructor publicConstructor = class1.getConstructor(String.class);//獲取指定聲明的public構造函數
理解了反射以後,AOP(面向切面編程)就很簡單代理
反射用的地方不少,如今全部的框架裏面幾乎處處是反射code
1. 靜態代理,直接寫一個新類對實現類進行包裝;對象
2. 動態代理,經過反射取得類實現,並調用方法,實現類必須實現其接口;blog
3. CGLib代理,不須要實現接口,能夠對任意類進行實現;接口
參考:get