1. 程式人生 > 遊戲 >3DM速報:《曠野之息2》宣佈跳票,索尼新訂閱服務推出

3DM速報:《曠野之息2》宣佈跳票,索尼新訂閱服務推出

一、定義

JAVA反射機制是在執行狀態中,對於任意一個類,都能夠知道這個類的所有屬性和方法;對於任意一個物件,都能夠呼叫它的任意方法和屬性;這種動態獲取資訊以及動態呼叫物件方法的功能稱為java語言的反射機制。

反射應該是 JVM讀取相應類的 位元組碼檔案

二、用途

在日常的第三方應用開發過程中,經常會遇到某個類的某個成員變數、方法或是屬性是私有的或是隻對系統應用開放,這時候就可以利用Java的反射機制通過反射來獲取所需的私有成員或是方法。

 

Java反射機制主要提供了以下功能:

  • 在執行時判斷任意一個物件所屬的類。
  • 在執行時構造任意一個類的物件。
  • 在執行時判斷任意一個類所具有的成員變數和方法。
  • 在執行時呼叫任意一個物件的方法。
  • 生成動態代理。

 

三、反射機制的相關類

與Java反射相關的類如下:

類名 用途
Class類 代表類的實體,在執行的Java應用程式中表示類和介面
Field類 代表類的成員變數(成員變數也稱為類的屬性)
Method類 代表類的方法
Constructor類 代表類的構造方法

 

3.1 Class類

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

  • 獲得類相關的方法
方法 用途
asSubclass(Class<U> clazz) 把傳遞的類的物件轉換成代表其子類的物件
Cast 把物件轉換成代表類或是介面的物件
getClassLoader() 獲得類的載入器
getClasses() 返回一個數組,陣列中包含該類中所有公共類和介面類的物件
getDeclaredClasses() 返回一個數組,陣列中包含該類中所有類和介面類的物件
forName(String className) 根據類名返回類的物件
getName() 獲得類的完整路徑名字
newInstance() 建立類的例項
getPackage() 獲得類的包
getSimpleName() 獲得類的名字
getSuperclass() 獲得當前類繼承的父類的名字
getInterfaces() 獲得當前類實現的類或是介面
  • 獲得類中屬性相關的方法
方法 用途
getField(String name) 獲得某個公有的屬性物件
getFields() 獲得所有公有的屬性物件
getDeclaredField(String name) 獲得某個屬性物件
getDeclaredFields() 獲得所有屬性物件
  • 獲得類中註解相關的方法
方法 用途
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

 

3.2 Field類

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

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

 

3.3 Method類

Method代表類的方法。

方法 用途
invoke(Object obj, Object... args) 傳遞object物件及引數呼叫該物件對應的方法

 

3.4 Constructor類

Constructor代表類的構造方法。

方法 用途
newInstance(Object... initargs) 根據傳遞的引數建立類的物件


 

示例

  • 被反射類Book.java
 1 public class Book{
 2     private final static String TAG = "BookTag";
 3 
 4     private String name;
 5     private String author;
 6 
 7     @Override
 8     public String toString() {
 9         return "Book{" +
10                 "name='" + name + '\'' +
11                 ", author='" + author + '\'' +
12                 '}';
13     }
14 
15     public Book() {
16     }
17 
18     private Book(String name, String author) {
19         this.name = name;
20         this.author = author;
21     }
22 
23     public String getName() {
24         return name;
25     }
26 
27     public void setName(String name) {
28         this.name = name;
29     }
30 
31     public String getAuthor() {
32         return author;
33     }
34 
35     public void setAuthor(String author) {
36         this.author = author;
37     }
38 
39     private String declaredMethod(int index) {
40         String string = null;
41         switch (index) {
42             case 0:
43                 string = "I am declaredMethod 1 !";
44                 break;
45             case 1:
46                 string = "I am declaredMethod 2 !";
47                 break;
48             default:
49                 string = "I am declaredMethod 1 !";
50         }
51 
52         return string;
53     }
54 }

 

  • 反射邏輯封裝在ReflectClass.java
  1 public class ReflectClass {
  2     private final static String TAG = "peter.log.ReflectClass";
  3 
  4     // 建立物件
  5     public static void reflectNewInstance() {
  6         try {
  7             Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
  8             Object objectBook = classBook.newInstance();
  9             Book book = (Book) objectBook;
 10             book.setName("Android進階之光");
 11             book.setAuthor("劉望舒");
 12             Log.d(TAG,"reflectNewInstance book = " + book.toString());
 13         } catch (Exception ex) {
 14             ex.printStackTrace();
 15         }
 16     }
 17 
 18     // 反射私有的構造方法
 19     public static void reflectPrivateConstructor() {
 20         try {
 21             Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
 22             Constructor<?> declaredConstructorBook = classBook.getDeclaredConstructor(String.class,String.class);
 23             declaredConstructorBook.setAccessible(true);
 24             Object objectBook = declaredConstructorBook.newInstance("Android開發藝術探索","任玉剛");
 25             Book book = (Book) objectBook;
 26             Log.d(TAG,"reflectPrivateConstructor book = " + book.toString());
 27         } catch (Exception ex) {
 28             ex.printStackTrace();
 29         }
 30     }
 31 
 32     // 反射私有屬性
 33     public static void reflectPrivateField() {
 34         try {
 35             Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
 36             Object objectBook = classBook.newInstance();
 37             Field fieldTag = classBook.getDeclaredField("TAG");
 38             fieldTag.setAccessible(true);
 39             String tag = (String) fieldTag.get(objectBook);
 40             Log.d(TAG,"reflectPrivateField tag = " + tag);
 41         } catch (Exception ex) {
 42             ex.printStackTrace();
 43         }
 44     }
 45 
 46     // 反射私有方法
 47     public static void reflectPrivateMethod() {
 48         try {
 49             Class<?> classBook = Class.forName("com.android.peter.reflectdemo.Book");
 50             Method methodBook = classBook.getDeclaredMethod("declaredMethod",int.class);
 51             methodBook.setAccessible(true);
 52             Object objectBook = classBook.newInstance();
 53             String string = (String) methodBook.invoke(objectBook,0);
 54 
 55             Log.d(TAG,"reflectPrivateMethod string = " + string);
 56         } catch (Exception ex) {
 57             ex.printStackTrace();
 58         }
 59     }
 60 
 61     // 獲得系統Zenmode值
 62     public static int getZenMode() {
 63         int zenMode = -1;
 64         try {
 65             Class<?> cServiceManager = Class.forName("android.os.ServiceManager");
 66             Method mGetService = cServiceManager.getMethod("getService", String.class);
 67             Object oNotificationManagerService = mGetService.invoke(null, Context.NOTIFICATION_SERVICE);
 68             Class<?> cINotificationManagerStub = Class.forName("android.app.INotificationManager$Stub");
 69             Method mAsInterface = cINotificationManagerStub.getMethod("asInterface",IBinder.class);
 70             Object oINotificationManager = mAsInterface.invoke(null,oNotificationManagerService);
 71             Method mGetZenMode = cINotificationManagerStub.getMethod("getZenMode");
 72             zenMode = (int) mGetZenMode.invoke(oINotificationManager);
 73         } catch (Exception ex) {
 74             ex.printStackTrace();
 75         }
 76 
 77         return zenMode;
 78     }
 79 
 80     // 關閉手機
 81     public static void shutDown() {
 82         try {
 83             Class<?> cServiceManager = Class.forName("android.os.ServiceManager");
 84             Method mGetService = cServiceManager.getMethod("getService",String.class);
 85             Object oPowerManagerService = mGetService.invoke(null,Context.POWER_SERVICE);
 86             Class<?> cIPowerManagerStub = Class.forName("android.os.IPowerManager$Stub");
 87             Method mShutdown = cIPowerManagerStub.getMethod("shutdown",boolean.class,String.class,boolean.class);
 88             Method mAsInterface = cIPowerManagerStub.getMethod("asInterface",IBinder.class);
 89             Object oIPowerManager = mAsInterface.invoke(null,oPowerManagerService);
 90             mShutdown.invoke(oIPowerManager,true,null,true);
 91 
 92         } catch (Exception ex) {
 93             ex.printStackTrace();
 94         }
 95     }
 96 
 97     public static void shutdownOrReboot(final boolean shutdown, final boolean confirm) {
 98         try {
 99             Class<?> ServiceManager = Class.forName("android.os.ServiceManager");
100             // 獲得ServiceManager的getService方法
101             Method getService = ServiceManager.getMethod("getService", java.lang.String.class);
102             // 呼叫getService獲取RemoteService
103             Object oRemoteService = getService.invoke(null, Context.POWER_SERVICE);
104             // 獲得IPowerManager.Stub類
105             Class<?> cStub = Class.forName("android.os.IPowerManager$Stub");
106             // 獲得asInterface方法
107             Method asInterface = cStub.getMethod("asInterface", android.os.IBinder.class);
108             // 呼叫asInterface方法獲取IPowerManager物件
109             Object oIPowerManager = asInterface.invoke(null, oRemoteService);
110             if (shutdown) {
111                 // 獲得shutdown()方法
112                 Method shutdownMethod = oIPowerManager.getClass().getMethod(
113                         "shutdown", boolean.class, String.class, boolean.class);
114                 // 呼叫shutdown()方法
115                 shutdownMethod.invoke(oIPowerManager, confirm, null, false);
116             } else {
117                 // 獲得reboot()方法
118                 Method rebootMethod = oIPowerManager.getClass().getMethod("reboot",
119                         boolean.class, String.class, boolean.class);
120                 // 呼叫reboot()方法
121                 rebootMethod.invoke(oIPowerManager, confirm, null, false);
122             }
123         } catch (Exception e) {
124             e.printStackTrace();
125         }
126     }
127 }