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

您的位置:首頁技術文章
文章詳情頁

詳解Java高級特性之反射

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

定義

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

用途

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

反射機制的相關類

與Java反射相關的類如下:

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

Class類

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

獲得類相關的方法

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

獲得類中屬性相關的方法

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

獲得類中構造器相關的方法

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

獲得類中方法相關的方法

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

類中其他重要的方法

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

Field類

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

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

Method類

Method代表類的方法。

方法 用途 invoke(Object obj, Object... args) 傳遞object對象及參數調用該對象對應的方法

Constructor類

Constructor代表類的構造方法。

方法 用途 newInstance(Object... initargs) 根據傳遞的參數創建類的對象

示例

為了演示反射的使用,首先構造一個與書籍相關的model——Book.java,然后通過反射方法示例創建對象、反射私有構造方法、反射私有屬性、反射私有方法,最后給出兩個比較復雜的反射示例——獲得當前ZenMode和關機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'; // 創建對象 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(); } } // 反射私有的構造方法 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開發藝術探索','任玉剛'); 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(); } } // 獲得系統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; } // 關閉手機 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); // 調用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); // 調用asInterface方法獲取IPowerManager對象 Object oIPowerManager = asInterface.invoke(null, oRemoteService); if (shutdown) {// 獲得shutdown()方法Method shutdownMethod = oIPowerManager.getClass().getMethod( 'shutdown', boolean.class, String.class, boolean.class);// 調用shutdown()方法shutdownMethod.invoke(oIPowerManager, confirm, null, false); } else {// 獲得reboot()方法Method rebootMethod = oIPowerManager.getClass().getMethod('reboot', boolean.class, String.class, boolean.class);// 調用reboot()方法rebootMethod.invoke(oIPowerManager, confirm, null, false); } } catch (Exception e) { e.printStackTrace(); } }}

調用相應反射邏輯方法 

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

Log輸出結果如下:

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開發藝術探索’, 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高級特性之反射的詳細內容,更多關于JAVA高級特性反射的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品7m凸凹视频分类| 一本一道久久a久久精品蜜桃| 成人日韩在线| 日韩在线高清| 蜜桃成人av| 日韩视频一区| 在线观看视频免费一区二区三区| 亚洲精品激情| 久久不卡日韩美女| 日韩精品中文字幕第1页| 91精品91| 在线精品一区二区| 国产欧美三级| 岛国精品一区| 久久视频国产| 亚洲一区欧美| 久久久精品区| 日韩国产网站| 欧美一区=区| 欧美日韩网址| 成人在线视频中文字幕| 欧美精品资源| 亚洲三区欧美一区国产二区| 国产精品黄色片| 色婷婷精品视频| 在线一区二区三区视频| 国产高清亚洲| 亚洲精品电影| 国产精品地址| 黄色在线一区| 免费日韩一区二区三区| 蜜臀91精品国产高清在线观看| 中文无码日韩欧| 国内精品麻豆美女在线播放视频| 亚洲激精日韩激精欧美精品| 久久不见久久见免费视频7| 亲子伦视频一区二区三区| 日韩三区四区| 成人在线网站| 欧美日韩在线精品一区二区三区激情综合| 91日韩在线| 日韩在线一区二区| 国产成人精选| 亚洲视频电影在线| 国产成人1区| 亚洲精品乱码| 99精品美女| 欧美在线首页| 激情综合自拍| 欧美激情麻豆| 日本 国产 欧美色综合| 中文字幕高清在线播放| 日本亚州欧洲精品不卡| 亚洲91精品| 久久一区亚洲| 日韩欧美中文字幕在线视频| 国产综合婷婷| 91视频一区| 国产另类在线| 亚洲欧美久久精品| 欧美亚洲国产精品久久| 国产66精品| 久久精品999| 久久亚洲色图| 午夜久久影院| 久久九九精品| 久久亚洲人体| 国产日韩欧美一区| 亚洲毛片在线免费| 亚洲欧美日韩高清在线| 日韩大片免费观看| 卡一精品卡二卡三网站乱码| 日韩av资源网| 亚洲精品在线二区| 免费不卡在线视频| 香蕉久久久久久久av网站| 久久亚洲国产| 中文字幕系列一区| 久久精品国产亚洲一区二区三区| 亚洲久久视频| 亚洲欧美日本日韩| 欧美日韩国产在线观看网站| 日韩精品免费一区二区三区| 国产一区二区三区久久久久久久久| 日韩免费精品| 综合激情在线| 蜜臀av性久久久久蜜臀aⅴ四虎 | 蜜臀久久99精品久久久画质超高清| 免费av一区二区三区四区| 欧美少妇精品| 丝袜诱惑一区二区| 精品一级视频| 高清av一区| 国产精品二区不卡| 亚洲一区资源| 成人午夜国产| 亚洲高清二区| 黄色亚洲大片免费在线观看| 国产麻豆综合| 免播放器亚洲一区| 亚洲一二av| 日产欧产美韩系列久久99| 日韩1区2区3区| 欧美一级一区| 麻豆中文一区二区| 精品不卡一区| 岛国av在线播放| 日韩成人高清| 欧美特黄一区| 深夜福利一区| 国产精品一区二区三区www| 国产精品17p| 手机在线电影一区| 欧美特黄一级大片| 日韩在线一区二区| 欧美在线黄色| 蜜桃精品视频| 免费一二一二在线视频| 不卡中文一二三区| 日韩在线视频一区二区三区| 国产激情久久| 人在线成免费视频| 影音先锋久久| 日韩av在线免费观看不卡| 鲁大师精品99久久久| 色综合五月天| 97精品国产福利一区二区三区| 视频精品一区二区| 国产欧美亚洲一区| 国产v日韩v欧美v| 亚洲先锋成人| 欧美精品中文| 日韩高清中文字幕一区二区| 鲁大师成人一区二区三区| 国产精品一国产精品k频道56| 日韩福利一区| 免费欧美日韩| 国产精品22p| 亚洲午夜久久久久久尤物| 日韩精品福利一区二区三区| 精品视频一区二区三区四区五区| 亚洲午夜黄色| 国产精品视频3p| 亚洲www啪成人一区二区| 中文字幕亚洲精品乱码| yellow在线观看网址| 中文精品在线| 国产精品乱战久久久| 久久亚洲精品中文字幕蜜潮电影| 亚洲精品精选| 成人久久一区| 国产亚洲欧美日韩在线观看一区二区| 97在线精品| 午夜天堂精品久久久久| 日本欧美不卡| 国产精品一区毛片| 六月婷婷一区| 在线观看精品| 国产欧美另类| 免费在线观看成人| 另类中文字幕国产精品| 国产精品亚洲综合在线观看| 国产麻豆综合| 久久久久91| 国产精品对白久久久久粗| 中文在线不卡| 国产91在线精品| 少妇精品久久久一区二区| 久久久噜噜噜| 久久精品免费看| 日韩av字幕| 美女精品一区| 久久激情婷婷| 国产成人久久精品麻豆二区| 日韩欧美久久| 亚洲欧美日韩一区在线观看| 日韩免费福利视频| 国产精品2023| 日韩精品福利一区二区三区| 免费日韩精品中文字幕视频在线| 日韩精品欧美| 国产精品xx| 国产亚洲欧美日韩精品一区二区三区| 在线综合视频| 五月精品视频| 亚洲a一区二区三区| 久久久久久网| 国产精品成久久久久| 美女视频网站久久| 久久国产视频网| 日本欧美一区| 日韩avvvv在线播放| 亚洲天堂日韩在线| 久久福利毛片| 99视频在线精品国自产拍免费观看| 欧美日韩免费观看视频| 日本久久综合| 国产成人久久精品麻豆二区| 精品日韩在线| 日韩综合在线|