概念
主要是指程序可以訪問解取,檢測和修改它本身狀態(tài)或行為的一種能力冀自,并能根據(jù)自身行為的狀態(tài)和結果蜈膨,調整或修改應用所描述行為的狀態(tài)和相關的語義
反射機制:所謂的反射機制就是java語言在運行時擁有一項自觀的能力董朝。通過這種能力可以徹底的了解自身的情況為下一步的動作做準備猿诸。
Java的反射機制的實現(xiàn)要借助于4個類:class,Constructor稳析,F(xiàn)ield洗做,Method;
其中class代表的運行時類對象弓叛,Constructor-類的構造器對象,F(xiàn)ield-類的屬性對象诚纸,Method-類的方法對象撰筷。通過這四個對象我們可以粗略的看到一個類的各個組 成部分。
作用
反射可以讓我們在運行時獲取類的屬性畦徘,方法毕籽,構造方法、父類井辆、接口等信息关筒,通過反射還可以讓我們在運行期實例化對象、調用方法杯缺、即使方法或屬性是私有的的也可以通過反射的形式調用蒸播。
所有為什么第三方庫基本都會使用到反射,正是因為反射這種 “看透 Class” 的能力萍肆。
- Java 反射機制主要提供了以下功能
在運行時判斷任意一個對象所屬的類袍榆。
在運行時構造任意一個類的對象。
在運行時判斷任意一個類所具有的成員變量和方法塘揣。
在運行時調用任意一個對象的方法
反射依賴于類元信息類-->class對象
- 知道一個類蜡塌,直接獲取 Class 對象
Class<?> cls1 = ReflectionActivity.class; - 如果已經得到了某個對象,可以通過這個對象獲取 Class 對象
ReflectionActivity activity = new ReflectionActivity();
Class<?> cls2 = activity.getClass(); - 如果你在編譯期獲取不到目標類型勿负,但是你知道它的完整類路徑馏艾,那么你可以通過如下的形式來獲取 Class 對象,這樣獲取可能會拋出異常 ClassNotFoundException奴愉。
try {
Class<?> cls3 = Class.forName("com.sun.study.ui.activity.ReflectionActivity");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
類元信息類-->class對象提供的方法
得到構造器的方法
Constructor getConstructor(Class[] params) -- 獲得使用特殊的參數(shù)類型的公共構造函數(shù)琅摩,
Constructor[] getConstructors() -- 獲得類的所有公共構造函數(shù)
Constructor getDeclaredConstructor(Class[] params) -- 獲得使用特定參數(shù)類型的構造函數(shù)(與接入級別無關)
Constructor[] getDeclaredConstructors() -- 獲得類的所有構造函數(shù)(與接入級別無關)
獲得字段信息的方法
Field getField(String name) -- 獲得命名的公共字段
Field[] getFields() -- 獲得類的所有公共字段
Field getDeclaredField(String name) -- 獲得類聲明的命名的字段
Field[] getDeclaredFields() -- 獲得類聲明的所有字段
獲得方法信息的方法
Method getMethod(String name, Class[] params) -- 使用特定的參數(shù)類型,獲得命名的公共方法
Method[] getMethods() -- 獲得類的所有公共方法
Method getDeclaredMethod(String name, Class[] params) -- 使用特寫的參數(shù)類型锭硼,獲得類聲明的命名的方法
Method[] getDeclaredMethods() -- 獲得類聲明的所有方法
其他
getModifiers()和Modifier.toString():獲得屬修飾符房资,例如private,public檀头,static等
getReturnType():獲得方法的返回類型
getParameterTypes():獲得方法的參數(shù)類型
getConstructors():獲得類的public類型的構造方法轰异。
getConstructor(Class[] parameterTypes):獲得類的特定構造方法。
getSuperclass():獲取某類的父類
getInterfaces():獲取某類實現(xiàn)的接口
用處
http://www.imooc.com/article/19224
Ref:
https://www.zhihu.com/question/24304289
http://sunfusheng.com/java/2016/04/12/reflection-annotation-injection.html