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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java高级特性——反射

發布時間:2024/9/27 java 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java高级特性——反射 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

1. 反射機制的相關類

與Java反射相關的類如下:

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

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

2. 獲得類相關的方法

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

3. 獲得類中屬性相關的方法

方法用途
getField(String name)獲得某個公有的屬性對象
getFields()獲得所有公有的屬性對象
getDeclaredField(String name)獲得某個屬性對象
getDeclaredFields()獲得所有屬性對象

4. 獲得類中注解相關的方法

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

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

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

6. 獲得類中方法相關的方法

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

7. 類中其他重要的方法

方法用途
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

8. Field類

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

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

9. Method類

Method代表類的方法。

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

10. 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;@Overridepublic 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獲取RemoteServiceObject 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 = BookTag 08-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

總結
本文列舉了反射機制使用過程中常用的、重要的一些類及其方法,更多信息和用法需要近一步的閱讀Google提供的相關文檔和示例。
在閱讀Class類文檔時發現一個特點,以通過反射獲得Method對象為例,
一般會提供四種方法:

  • getMethod(parameterTypes)
  • getMethods()
  • getDeclaredMethod(parameterTypes)
  • getDeclaredMethods()

getMethod(parameterTypes)用來獲取某個公有的方法的對象,getMethods()獲得該類所有公有的方法,getDeclaredMethod(parameterTypes)獲得該類某個方法,getDeclaredMethods()獲得該類所有方法。帶有Declared修飾的方法可以反射到私有的方法,沒有Declared修飾的只能用來反射公有的方法。其他的Annotation、Field、Constructor也是如此。

總結

以上是生活随笔為你收集整理的Java高级特性——反射的全部內容,希望文章能夠幫你解決所遇到的問題。

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