日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android反射开启通知_Android中反射的简单应用

發布時間:2025/3/15 Android 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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中反射的简单应用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。