最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

詳解Java高級特性之反射

 更新時間:2020年06月11日 10:54:04   作者:寶**貝  
這篇文章主要介紹了Java高級特性之反射的相關(guān)知識,文中講解非常細致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下

定義

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 = 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

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

相關(guān)文章

  • javaweb實現(xiàn)投票系統(tǒng)

    javaweb實現(xiàn)投票系統(tǒng)

    這篇文章主要為大家詳細介紹了javaweb實現(xiàn)投票系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-09-09
  • SpringBoot前后端分離項目之打包、部署到服務(wù)器詳細圖文流程

    SpringBoot前后端分離項目之打包、部署到服務(wù)器詳細圖文流程

    作為后臺開發(fā),項目打包部署是經(jīng)常性的操作,下面這篇文章主要給大家介紹了關(guān)于SpringBoot前后端分離項目之打包、部署到服務(wù)器的相關(guān)資料,文中通過代碼示例介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • 詳解JAVA 時間處理相關(guān)類

    詳解JAVA 時間處理相關(guān)類

    這篇文章主要介紹了JAVA 時間處理相關(guān)類的知識,文中示例代碼非常詳細,供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • 關(guān)于Java數(shù)組查詢的相關(guān)問題及實例

    關(guān)于Java數(shù)組查詢的相關(guān)問題及實例

    這篇文章主要介紹了關(guān)于Java數(shù)組查詢的相關(guān)問題及實例,需要的朋友可以參考下。
    2017-08-08
  • @RequestMapping對不同參數(shù)的接收方式示例詳解

    @RequestMapping對不同參數(shù)的接收方式示例詳解

    Spring?MVC框架中,@RequestMapping注解用于映射URL到控制器方法,不同的參數(shù)類型如簡單參數(shù)、實體參數(shù)、數(shù)組參數(shù)、集合參數(shù)、日期參數(shù)和JSON參數(shù),本文給大家介紹@RequestMapping對不同參數(shù)的接收方式,感興趣的朋友一起看看吧
    2024-10-10
  • 老生常談比較排序之堆排序

    老生常談比較排序之堆排序

    下面小編就為大家?guī)硪黄仙U劚容^排序之堆排序。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java Swing仿QQ登錄界面效果

    Java Swing仿QQ登錄界面效果

    這篇文章主要為大家詳細介紹了Java Swing仿QQ登錄界面效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之排序算法

    Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之排序算法

    排序算法是《數(shù)據(jù)結(jié)構(gòu)與算法》中最基本的算法之一。排序算法可以分為內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存
    2022-02-02
  • 詳解HTTP請求與響應(yīng)基礎(chǔ)及實例

    詳解HTTP請求與響應(yīng)基礎(chǔ)及實例

    這篇文章主要介紹了詳解HTTP請求與響應(yīng)基礎(chǔ)及實例的相關(guān)資料,這里對http的請求和響應(yīng)進行詳細分析并附有實現(xiàn)實例,需要的朋友可以參考下
    2017-07-07
  • Java實現(xiàn)數(shù)獨小游戲

    Java實現(xiàn)數(shù)獨小游戲

    這篇文章主要為大家詳細介紹了Java實現(xiàn)數(shù)獨小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-05-05

最新評論

兴安盟| 香格里拉县| 体育| 额敏县| 东平县| 靖西县| 万全县| 竹山县| 安宁市| 温泉县| 万荣县| 江阴市| 东阳市| 南阳市| 新建县| 阳新县| 荔浦县| 信宜市| 城口县| 衡阳市| 南阳市| 手游| 谷城县| 舞阳县| 郑州市| 萍乡市| 延安市| 玉溪市| 赤壁市| 大埔区| 儋州市| 仪陇县| 上高县| 津南区| 定结县| 贵溪市| 阿拉善右旗| 荣成市| 花垣县| 洛川县| 塔城市|