Java中反射機制: 容許運行中的程序對自身進行檢查,並能直接操做程序內部的屬性或者方法。
理解: JAVA反射機制是在運行狀態中,對於任意一個類,都可以知道這個類的全部屬性和方法;
對於任意一個對象,都可以調用它的任意一個方法;
這種動態獲取的信息以及動態調用對象的方法的功能稱爲java語言的反射機制java
反射機制的實現藉助4個類: class(類對象),
Constructor(類的構造器對象),
Field(類的屬性對象),
Method (類的方法對象)數組
注意點: 利用反射機制在Java程序中,動態的去調用一些protected甚至是private的方法或類函數
獲取對象的方法:
1. getClass(): Object對象.getClass() 每一個類都有此方法
2. Class.forName() 不少開發中,會直接經過類的名稱取得Class類的對象
3. .class屬性ui
獲取構造方法:
1.getConstructors() 返回全部具備public屬性的構造函數數組
2.getConstructor(Class[] params) 根據構造函數的參數,返回一個具體的具備public屬性的構造函數
3.getDeclaredConstructor(Class[] params) 根據構造函數的參數,返回一個具體的構造函數(不分public和非public屬性)
4.getDeclaredConstructors() 返回該類中全部的構造函數數組(不分public和非public屬性)this
獲取方法對象:
1.getMethod(String name, Class[] params) 根據方法名和參數,返回一個具體的具備public屬性的方法
2.getMethods() 返回全部具備public屬性的方法數組
3.getDeclaredMethod(String name, Class[] params) 根據方法名和參數,返回一個具體的方法(不分public和非public屬性
4.getDeclaredMethods() 返回該類中的全部的方法數組(不分public和非public屬性)對象
注意點:方法getDeclaredMethods()只能獲取到由當前類定義的全部方法,不能獲取從父類繼承的方法
方法getMethods() 不只能獲取到當前類定義的public方法,也能獲得從父類繼承和已經實現接口的public方法繼承
獲取屬性對象:
1.getField(String name) 根據變量名,返回一個具體的具備public屬性的成員變量
2.getFields() 返回具備public屬性的成員變量的數組
3.getDeclaredField(String name) 根據變量名,返回一個成員變量(不分public和非public屬性)
4.getDelcaredField() 返回全部成員變量組成的數組(不分public和非public屬性)接口
實例化類對象的方法:
1.利用Constructor類調用newInstance()方法
2.利用Class類自己的newInstance()方法建立一個實例開發
實例: 經過java中反射技術阻止,點擊按鈕後關閉對話框,即不讓按鈕關閉 例如,輸入校驗碼,密碼之類的校驗問題
AlertDialog.Builder builder = new AlertDialog.Builder(LoginActivity.this);get
builder.setMessage("您肯定退出嗎?") .setTitle("友情提示") .setNegativeButton("取消", null) .setPositiveButton("肯定", new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int id) { /* * 源碼中有一個boolean變量是控件對話框的關閉與否的mShowing變量, * 咱們只須要利用反射改變這個變量就能夠控制咱們的對話框是否是關閉了 */ try { Field field=dialog.getClass().getSuperclass().getDeclaredField("mShowing"); field.setAccessible(true); field.set(dialog, false);//將mShowing變量設置爲false, 表示不關閉對話框 field.set(dialog, true);//將mShowing變量設置爲false, 表示關閉對話框 } catch (Exception e) { // TODO 自動生成的 catch 塊 e.printStackTrace(); } } }); AlertDialog alert = builder.create(); alert.show();