日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

詳解Java高級特性之反射

瀏覽:47日期:2022-08-31 10:35:26

定義

JAVA反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調(diào)用它的任意方法和屬性;這種動態(tài)獲取信息以及動態(tài)調(diào)用對象方法的功能稱為java語言的反射機制。

用途

在日常的第三方應(yīng)用開發(fā)過程中,經(jīng)常會遇到某個類的某個成員變量、方法或是屬性是私有的或是只對系統(tǒng)應(yīng)用開放,這時候就可以利用Java的反射機制通過反射來獲取所需的私有成員或是方法。當然,也不是所有的都適合反射,之前就遇到一個案例,通過反射得到的結(jié)果與預(yù)期不符。閱讀源碼發(fā)現(xiàn),經(jīng)過層層調(diào)用后在最終返回結(jié)果的地方對應(yīng)用的權(quán)限進行了校驗,對于沒有權(quán)限的應(yīng)用返回值是沒有意義的缺省值,否則返回實際值起到保護用戶的隱私目的。

反射機制的相關(guān)類

與Java反射相關(guān)的類如下:

類名 用途 Class類 代表類的實體,在運行的Java應(yīng)用程序中表示類和接口 Field類 代表類的成員變量(成員變量也稱為類的屬性) Method類 代表類的方法 Constructor類 代表類的構(gòu)造方法

Class類

Class代表類的實體,在運行的Java應(yīng)用程序中表示類和接口。在這個類中提供了很多有用的方法,這里對他們簡單的分類介紹。

獲得類相關(guān)的方法

方法 用途 asSubclass(Class<U> clazz) 把傳遞的類的對象轉(zhuǎn)換成代表其子類的對象 Cast 把對象轉(zhuǎn)換成代表類或是接口的對象 getClassLoader() 獲得類的加載器 getClasses() 返回一個數(shù)組,數(shù)組中包含該類中所有公共類和接口類的對象 getDeclaredClasses() 返回一個數(shù)組,數(shù)組中包含該類中所有類和接口類的對象 forName(String className) 根據(jù)類名返回類的對象 getName() 獲得類的完整路徑名字 newInstance() 創(chuàng)建類的實例 getPackage() 獲得類的包 getSimpleName() 獲得類的名字 getSuperclass() 獲得當前類繼承的父類的名字 getInterfaces() 獲得當前類實現(xiàn)的類或是接口

獲得類中屬性相關(guān)的方法

方法 用途 getAnnotation(Class<A> annotationClass) 返回該類中與參數(shù)類型匹配的公有注解對象 getAnnotations() 返回該類所有的公有注解對象 getDeclaredAnnotation(Class<A> annotationClass) 返回該類中與參數(shù)類型匹配的所有注解對象 getDeclaredAnnotations() 返回該類所有的注解對象

獲得類中構(gòu)造器相關(guān)的方法

方法 用途 getConstructor(Class...<?> parameterTypes) 獲得該類中與參數(shù)類型匹配的公有構(gòu)造方法 getConstructors() 獲得該類的所有公有構(gòu)造方法 getDeclaredConstructor(Class...<?> parameterTypes) 獲得該類中與參數(shù)類型匹配的構(gòu)造方法 getDeclaredConstructors() 獲得該類所有構(gòu)造方法

獲得類中方法相關(guān)的方法

方法 用途 getMethod(String name, Class...<?> parameterTypes) 獲得該類某個公有的方法 getMethods() 獲得該類所有公有的方法 getDeclaredMethod(String name, Class...<?> parameterTypes) 獲得該類某個方法 getDeclaredMethods() 獲得該類所有方法

類中其他重要的方法

方法 用途 isAnnotation() 如果是注解類型則返回true isAnnotationPresent(Class<? extends Annotation> annotationClass) 如果是指定類型注解類型則返回true isAnonymousClass() 如果是匿名類則返回true isArray() 如果是一個數(shù)組類則返回true isEnum() 如果是枚舉類則返回true isInstance(Object obj) 如果obj是該類的實例則返回true isInterface() 如果是接口類則返回true isLocalClass() 如果是局部類則返回true isMemberClass() 如果是內(nèi)部類則返回true

Field類

Field代表類的成員變量(成員變量也稱為類的屬性)。

方法 用途 equals(Object obj) 屬性與obj相等則返回true get(Object obj) 獲得obj中對應(yīng)的屬性值 set(Object obj, Object value) 設(shè)置obj中對應(yīng)屬性值

Method類

Method代表類的方法。

方法 用途 invoke(Object obj, Object... args) 傳遞object對象及參數(shù)調(diào)用該對象對應(yīng)的方法

Constructor類

Constructor代表類的構(gòu)造方法。

方法 用途 newInstance(Object... initargs) 根據(jù)傳遞的參數(shù)創(chuàng)建類的對象

示例

為了演示反射的使用,首先構(gòu)造一個與書籍相關(guān)的model——Book.java,然后通過反射方法示例創(chuàng)建對象、反射私有構(gòu)造方法、反射私有屬性、反射私有方法,最后給出兩個比較復(fù)雜的反射示例——獲得當前ZenMode和關(guān)機Shutdown。

被反射類Book.java

public class Book{ private final static String TAG = 'BookTag'; private String name; private String author; @Override public String toString() { return 'Book{' +'name=’' + name + ’’’ +', author=’' + author + ’’’ +’}’; } public Book() { } private Book(String name, String author) { this.name = name; this.author = author; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } private String declaredMethod(int index) { String string = null; switch (index) { case 0:string = 'I am declaredMethod 1 !';break; case 1:string = 'I am declaredMethod 2 !';break; default:string = 'I am declaredMethod 1 !'; } return string; }}

反射邏輯封裝在ReflectClass.java

public class ReflectClass { private final static String TAG = 'peter.log.ReflectClass'; // 創(chuàng)建對象 public static void reflectNewInstance() { try { Class<?> classBook = Class.forName('com.android.peter.reflectdemo.Book'); Object objectBook = classBook.newInstance(); Book book = (Book) objectBook; book.setName('Android進階之光'); book.setAuthor('劉望舒'); Log.d(TAG,'reflectNewInstance book = ' + book.toString()); } catch (Exception ex) { ex.printStackTrace(); } } // 反射私有的構(gòu)造方法 public static void reflectPrivateConstructor() { try { Class<?> classBook = Class.forName('com.android.peter.reflectdemo.Book'); Constructor<?> declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class); declaredConstructorBook.setAccessible(true); Object objectBook = declaredConstructorBook.newInstance('Android開發(fā)藝術(shù)探索','任玉剛'); Book book = (Book) objectBook; Log.d(TAG,'reflectPrivateConstructor book = ' + book.toString()); } catch (Exception ex) { ex.printStackTrace(); } } // 反射私有屬性 public static void reflectPrivateField() { try { Class<?> classBook = Class.forName('com.android.peter.reflectdemo.Book'); Object objectBook = classBook.newInstance(); Field fieldTag = classBook.getDeclaredField('TAG'); fieldTag.setAccessible(true); String tag = (String) fieldTag.get(objectBook); Log.d(TAG,'reflectPrivateField tag = ' + tag); } catch (Exception ex) { ex.printStackTrace(); } } // 反射私有方法 public static void reflectPrivateMethod() { try { Class<?> classBook = Class.forName('com.android.peter.reflectdemo.Book'); Method methodBook = classBook.getDeclaredMethod('declaredMethod',int.class); methodBook.setAccessible(true); Object objectBook = classBook.newInstance(); String string = (String) methodBook.invoke(objectBook,0); Log.d(TAG,'reflectPrivateMethod string = ' + string); } catch (Exception ex) { ex.printStackTrace(); } } // 獲得系統(tǒng)Zenmode值 public static int getZenMode() { int zenMode = -1; try { Class<?> cServiceManager = Class.forName('android.os.ServiceManager'); Method mGetService = cServiceManager.getMethod('getService', String.class); Object oNotificationManagerService = mGetService.invoke(null, Context.NOTIFICATION_SERVICE); Class<?> cINotificationManagerStub = Class.forName('android.app.INotificationManager$Stub'); Method mAsInterface = cINotificationManagerStub.getMethod('asInterface',IBinder.class); Object oINotificationManager = mAsInterface.invoke(null,oNotificationManagerService); Method mGetZenMode = cINotificationManagerStub.getMethod('getZenMode'); zenMode = (int) mGetZenMode.invoke(oINotificationManager); } catch (Exception ex) { ex.printStackTrace(); } return zenMode; } // 關(guān)閉手機 public static void shutDown() { try { Class<?> cServiceManager = Class.forName('android.os.ServiceManager'); Method mGetService = cServiceManager.getMethod('getService',String.class); Object oPowerManagerService = mGetService.invoke(null,Context.POWER_SERVICE); Class<?> cIPowerManagerStub = Class.forName('android.os.IPowerManager$Stub'); Method mShutdown = cIPowerManagerStub.getMethod('shutdown',boolean.class,String.class,boolean.class); Method mAsInterface = cIPowerManagerStub.getMethod('asInterface',IBinder.class); Object oIPowerManager = mAsInterface.invoke(null,oPowerManagerService); mShutdown.invoke(oIPowerManager,true,null,true); } catch (Exception ex) { ex.printStackTrace(); } } public static void shutdownOrReboot(final boolean shutdown, final boolean confirm) { try { Class<?> ServiceManager = Class.forName('android.os.ServiceManager'); // 獲得ServiceManager的getService方法 Method getService = ServiceManager.getMethod('getService', java.lang.String.class); // 調(diào)用getService獲取RemoteService Object oRemoteService = getService.invoke(null, Context.POWER_SERVICE); // 獲得IPowerManager.Stub類 Class<?> cStub = Class.forName('android.os.IPowerManager$Stub'); // 獲得asInterface方法 Method asInterface = cStub.getMethod('asInterface', android.os.IBinder.class); // 調(diào)用asInterface方法獲取IPowerManager對象 Object oIPowerManager = asInterface.invoke(null, oRemoteService); if (shutdown) {// 獲得shutdown()方法Method shutdownMethod = oIPowerManager.getClass().getMethod( 'shutdown', boolean.class, String.class, boolean.class);// 調(diào)用shutdown()方法shutdownMethod.invoke(oIPowerManager, confirm, null, false); } else {// 獲得reboot()方法Method rebootMethod = oIPowerManager.getClass().getMethod('reboot', boolean.class, String.class, boolean.class);// 調(diào)用reboot()方法rebootMethod.invoke(oIPowerManager, confirm, null, false); } } catch (Exception e) { e.printStackTrace(); } }}

調(diào)用相應(yīng)反射邏輯方法 

try { // 創(chuàng)建對象 ReflectClass.reflectNewInstance(); // 反射私有的構(gòu)造方法 ReflectClass.reflectPrivateConstructor(); // 反射私有屬性 ReflectClass.reflectPrivateField(); // 反射私有方法 ReflectClass.reflectPrivateMethod(); } catch (Exception ex) { ex.printStackTrace(); } Log.d(TAG,' zenmode = ' + ReflectClass.getZenMode());

Log輸出結(jié)果如下:

08-27 15:11:37.999 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass: reflectNewInstance book = Book{name=’Android進階之光’, author=’劉望舒’}08-27 15:11:38.000 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass: reflectPrivateConstructor book = Book{name=’Android開發(fā)藝術(shù)探索’, author=’任玉剛’}08-27 15:11:38.000 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass: reflectPrivateField tag = BookTag08-27 15:11:38.000 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectClass: reflectPrivateMethod string = I am declaredMethod 1 !08-27 15:11:38.004 11987-11987/com.android.peter.reflectdemo D/peter.log.ReflectDemo: zenmode = 0

以上就是詳解Java高級特性之反射的詳細內(nèi)容,更多關(guān)于JAVA高級特性反射的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標簽: Java
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
日韩午夜电影| 免费看日韩精品| 国产精品片aa在线观看| 久久亚洲色图| 日韩精品一卡二卡三卡四卡无卡| 午夜国产欧美理论在线播放 | 久久香蕉网站| 精品一区二区三区中文字幕视频 | 伊人久久亚洲美女图片| 美女毛片一区二区三区四区| 久久精品国产大片免费观看| 日韩欧美字幕| 日本国产精品| 亚洲欧洲一区二区天堂久久| 午夜一区在线| 日本aⅴ免费视频一区二区三区| 日韩精品一区二区三区免费视频| 欧美视频精品全部免费观看| 国产精品亲子伦av一区二区三区 | 国产欧美日韩一区二区三区四区| 国产精品国产三级国产在线观看| 婷婷亚洲五月| 天堂成人国产精品一区| 亚洲精品日本| 欧美亚洲日本精品| 高清av一区| 日韩综合精品| 午夜精品亚洲| 日本成人一区二区| 欧美精品成人| 日韩欧美一区二区三区免费看| 免费视频一区三区| 色综合视频一区二区三区日韩 | 欧美一区网站| 九九九精品视频| 99久久视频| 天堂av一区| 97人人精品| 亚洲一区二区三区免费在线观看| 欧美伊人影院| 色88888久久久久久影院| 成人欧美一区二区三区的电影| 一区福利视频| 国产精品丝袜在线播放| 日本精品影院| 日本aⅴ免费视频一区二区三区| 精品一区二区三区视频在线播放| 欧美日韩尤物久久| 日本午夜精品视频在线观看| yellow在线观看网址| 国产一级一区二区| 国产精品天天看天天狠| 亚洲国产一区二区三区在线播放| 日韩中文字幕无砖| 亚洲四虎影院| 欧美久久亚洲| 在线视频观看日韩| 久久国产精品免费一区二区三区| 青青久久av| 国产精品一站二站| 欧美日韩国产在线观看网站| 国产欧美一区二区精品久久久 | 亚洲精品成人| 麻豆极品一区二区三区| 欧美日韩免费观看一区=区三区| 国产精品久久久久77777丨| japanese国产精品| 国产不卡av一区二区| 视频国产精品| 欧美成人亚洲| 国际精品欧美精品| 涩涩涩久久久成人精品| www成人在线视频| 国产精品17p| 美国欧美日韩国产在线播放| 高清一区二区| 91精品视频一区二区| av成人国产| 日韩久久视频| 国产精品日韩精品在线播放| 日韩在线卡一卡二| 91精品国产乱码久久久久久久| 国产精品免费精品自在线观看| 国产精品丝袜xxxxxxx| 亚洲国产福利| 国产精品777777在线播放| 最新国产精品久久久| 欧美成人综合| 91精品一区二区三区综合在线爱| 国产精品xvideos88| 蜜桃久久久久久| 自由日本语亚洲人高潮| 91综合网人人| 久久精品一区二区国产| 日韩精品乱码av一区二区| 中文日韩在线| 激情综合亚洲| 天堂av在线| zzzwww在线看片免费| 欧美aaaaaa午夜精品| 日韩av午夜在线观看| 蜜桃视频在线观看一区| 亚洲精品网址| 亚洲一级特黄| 播放一区二区| 亚洲午夜天堂| 成人亚洲精品| 精品国产日韩欧美精品国产欧美日韩一区二区三区 | 精品五月天堂| 青青国产精品| 亚洲精品裸体| 亚洲欧美网站| 久久不射中文字幕| 在线午夜精品| 亚洲男女自偷自拍| 国产精品毛片在线| 亚洲一区二区毛片| 久久一二三区| 人人精品人人爱| 亚洲一区二区三区久久久| 亚洲综合五月| 日韩精品亚洲专区| 久久国内精品自在自线400部| 97成人超碰| 日韩久久一区| 欧美片第1页综合| 国产欧美在线观看免费| 国产精品高潮呻吟久久久久| 国产精品亲子伦av一区二区三区 | 国产精品一区二区美女视频免费看| 日本一不卡视频| 日韩国产在线观看一区| 日韩高清成人在线| 日韩精品视频一区二区三区| 五月亚洲婷婷 | 亚洲麻豆一区| 日本一区福利在线| 日韩精品第一| 国产欧美日韩影院| 久久97视频| 欧美三区四区| 欧美日韩精品一本二本三本| 亚洲欧美日韩在线观看a三区| 蜜臀av一区二区在线免费观看| 日韩欧美高清一区二区三区| 日本午夜精品久久久| 欧美aaaaaa午夜精品| 日韩久久电影| 亚洲专区欧美专区| 奇米狠狠一区二区三区| 久久字幕精品一区| 欧美日韩精品免费观看视欧美高清免费大片| 亚洲婷婷免费| 老司机精品久久| 久久精品99久久久| 日本激情一区| 国精品一区二区三区| 视频一区欧美精品| 欧美日韩1区2区3区| 97在线精品| 99riav1国产精品视频| 日韩黄色免费网站| 国产精品成人a在线观看| 欧美午夜不卡| 亚洲精品国产精品粉嫩| 麻豆国产欧美日韩综合精品二区| 最近高清中文在线字幕在线观看1| 一区福利视频| 国产乱人伦丫前精品视频| 91偷拍一区二区三区精品| 欧美日韩激情| 国产亚洲精品美女久久| 蜜桃av在线播放| 最新国产精品| 鲁鲁在线中文| 丝袜美腿亚洲色图| 国产欧美日韩一区二区三区四区| 天堂8中文在线最新版在线| 男女性色大片免费观看一区二区| 欧美激情 亚洲a∨综合| 欧美.日韩.国产.一区.二区 | 97人人精品| 蜜桃久久av一区| 激情视频网站在线播放色| 蜜桃视频一区二区三区| 福利视频一区| 影音先锋久久| 久草精品视频| 视频精品一区二区| 国产成人1区| 少妇精品久久久一区二区| 伊人久久国产| 国产亚洲一区二区三区啪| 欧美日韩在线二区| 国产一级成人av| 9色精品在线| 国产成人精品三级高清久久91| 亚洲精品中文字幕99999| 成人日韩在线| 国产精品xvideos88|