android反射开启通知_Android中反射的简单应用
自己對反射的理解和應用還處于比較淺顯的階段,寫這篇文章更多在于整理總結,也就是幫助自己進一步的理解和學習反射機制。
反射
反射的概念是由Smith在1982年首次提出的,主要是指程序可以訪問、檢測和修改它本身狀態或行為的一種能力。
java中類反射
反射是 Java 程序開發語言的特征之一,它允許運行中的 Java 程序對自身進行檢查,或者說“自審”,并能直接操作程序的內部屬性和方法。
簡單總結這些定義,那就是反射可以讓我們獲得一個類的所有信息,包括私有屬性和私有方法,對于我們這種小白,先知道這點就可以啦,那在java中如何使用發射呢。這里我們隨便創建一個類來演示。比如說創建一個Book類:
public class Book implements Parcelable
{
private int id=1;
private String name="android";
private String author="wf";
private String getName()
{
return name;
}
}
Book類中屬性和方法都是私有的,現在我們通過反射來訪問這些屬性和方法。
String s = null;
try
{
Class> bookClass = Class.forName("cc.abto.demo.Book");//完整類名
Object book = bookClass.newInstance();//獲得實例
Method getAuthor = bookClass.getDeclaredMethod("getName");//獲得私有方法
getAuthor.setAccessible(true);//調用方法前,設置訪問標志
s = (String) getAuthor.invoke(book);//使用方法
}
catch (Exception e)
{
e.printStackTrace();
}
可以看到上面代碼中我們用Class和Method這兩個類完成了反射,這兩個類分別對應了類和方法,也就是包裝了類和方法的信息,下面對反射的部分API做一下簡單介紹:
Class類:代表一個類,位于java.lang包下
Field類:代表類的成員變量(成員變量也稱為類的屬性)
Method類:代表類的方法
Constructor類:代表類的構造方法
Array類:提供了動態創建數組,以及訪問數組的元素的靜態方法
在Java中,每個class都有一個相應的Class對象。也就是說,當我們編寫一個類,編譯完成后,在生成的.class文件中,就會產生一個Class對象,用于表示這個類的類型信息。 java中的Class三種獲取方式:
//使用Class類的靜態方法forName(),用類的名字獲取一個Class實例
Class> bookClass = Class.forName("cc.abto.demo.Book");
//利用對象調用getClass()方法獲取該對象的Class實例
Book book = new Book();
Class extends Book> bookClass = book.getClass();
//運用.class的方式來獲取Class實例,對于基本數據類型的封裝類,還可以采用.TYPE來獲取相對應的基本數據類型的Class實例
Class bookClass = Book.class;
Class type = Integer.TYPE;
然后再貼一些常用的方法
public Annotation[] getAnnotations () //獲取這個類中所有注解
getClassLoader() //獲取加載這個類的類加載器
getDeclaredMethods() //獲取這個類中的所有方法
getReturnType() //獲取方法的返回類型
getParameterTypes() //獲取方法的傳入參數類型
isAnnotation() //測試這類是否是一個注解類
getDeclaredConstructors() //獲取所有的構造方法
getDeclaredMethod(String name, Class… parameterTypes)// 獲取指定的構造方法(參數:參數類型.class)
getSuperclass() //獲取這個類的父類
getInterfaces()// 獲取這個類實現的所有接口
getFields() //獲取這個類中所有被public修飾的成員變量
getField(String name) //獲取指定名字的被public修飾的成員變量
newInstance() //返回此Class所表示的類,通過調用默認的(即無參數)構造函數創建的一個新實例
更多的方法和方法的注解大家可以查看文檔。
Android中的簡單應用
查看Android SDK的源碼時候。你會發現很多類或方法中經常加上了“@hide”注釋標記,這些API是不允許在程序中調用的。Hidden API之所以被隱藏,是想阻止開發者使用SDK中那些未完成或不穩定的部分(接口或架構)。如圖所示
所以在開發中,我們不僅可以通過反射獲取私有屬性和方法,也可以利用反射獲取一些SDK對外部隱藏的API,比如說前陣子在做藍牙開發的時候,自動配對的一些方法在API 19以后才對外開放的,這邊我們就可以使用反射來實現配對功能了
try
{
Class bluetoothDeviceClass = BluetoothDevice.class;
bluetoothDeviceClass.getMethod("setPin", byte[].class).invoke(device, "1234".getBytes());
bluetoothDeviceClass.getMethod("createBond").invoke(device);
bluetoothDeviceClass.getMethod("setPairingConfirmation", boolean.class).invoke(device, true);
bluetoothDeviceClass.getMethod("cancelPairingUserInput").invoke(device);
}
catch (Exception e)
{
e.printStackTrace();
}
反射的好處
反射不僅可以讓我們獲得隱藏的方法和屬性,還可以讓對象的實例化從編譯時轉化為運行時,因為我們可以通過Class.forName("cc.abto.demo.Book").newInstance()的方法來生成新的實例,而這邊的"cc.abto.demo.Book"是一個字符串,完全可以用變量來代替,再結合抽象工廠模式什么的,我們就可以很大程度上對程序應用中的功能模塊進行解耦合。可能這邊簡單幾句沒能解釋清楚,大家可以看看《大話設計模式》之類的書,里面就介紹的比較清楚明白了。
反射的弊端
反射帶來的兩大弊端可能就是安全和性能問題了吧,這方面我知之甚少,有待進一步的了解和學習。
最后
總結
以上是生活随笔為你收集整理的android反射开启通知_Android中反射的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle数据库12下载地址,Orac
- 下一篇: C++ PAT 乙级 ——1002 读入