亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java反射獲取實例的速度對比分析

 更新時間:2020年09月28日 14:43:51   作者:天上飛下一毛雪  
這篇文章主要介紹了Java反射獲取實例的速度對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

之前代碼有一個邏輯,是在初始化時讀取某個包下的所有class文件,放入到一個HashMap里。代碼運行過程中,通過Key獲取到對應(yīng)class的全路徑名,最后通過Class.forName(className).getDeclaredConstructor().newInstance()獲取實例對象。

后來同事看到了代碼,對這個HashMap里存儲方式提出了建議,之前的Map是<String,String>完全可以改成<String,Class>

后來我測試了一下兩者實例化一個對象的速度:

  public static void main(String[] args) {
    try {
      int MAX = 100000;
      for (int count = 0; count < 50; count++) {
        System.out.println("====第" + count+"次");
 
        long s1 = System.currentTimeMillis();
        for (int i = 0; i < MAX; i++) {
          Person o = (Person)Class.forName("com.qingtai.domin.Person").newInstance();
        }
        long e1 = System.currentTimeMillis();
        System.out.println("1_duration:" + (e1 - s1));
 
        long s2 = System.currentTimeMillis();
        Class clazz = Class.forName("com.qingtai.domin.Person");
        for (int i = 0; i < MAX; i++) {
          Person person = (Person) clazz.newInstance();
        }
        long e2 = System.currentTimeMillis();
        System.out.println("2_duration:" + (e2 - s2));
      }
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

輸出:

====第39次 1_duration:72 2_duration:3 ====第40次 1_duration:79 2_duration:12 ====第41次 1_duration:92 2_duration:8 ====第42次 1_duration:80 2_duration:5

結(jié)論:

Map的value不存儲全路徑名,在初始化的時候Map的value直接存儲Class對象,在反射過程中速度提升很大。

補充知識:java反射獲取類實例并調(diào)用私有方法

我就廢話不多說了,大家還是直接看代碼吧~

public class TestReflect {//測試類
 
 public void mPublic() {//訪問權(quán)限最大
 System.out.println("public run");
 }
 
 protected void mProtected() {//同包下才能訪問(實驗對象)
 System.out.println("protected run");
 }
 
 private void mPrivate() {//只有本類中才能訪問(實驗對象)
 System.out.println("private run");
 } 
}
 public static void main(String[] args) throws Exception {
 Class<?> class1 = null;
 // 反射獲取類實例,用的最多的就是jdbc獲取驅(qū)動的時候就是用Class.forName("xxx");
 // 一般采用這種形式
 class1 = Class.forName("com.xxx.TestReflect");
 // class1 = new TestReflect().getClass();
 // class1 = TestReflect.class;
 
 // 類實例化,到這里就可以訪問TestReflect類的public屬性的成員方法和成員變量了
 TestReflect tr = (TestReflect) class1.newInstance();
 
 // 通過java.lang.Class類得到一個Method對象
 // api中java.lang.Class.getDeclaredMethod方法介紹
 // 返回一個 Method 對象,該對象反映此 Class 對象所表示的類或接口的指定已聲明方法。
   Method method = class1.getDeclaredMethod("mPrivate");
   Method method1 = class1.getDeclaredMethod("mProtected");
   
   //將此對象的 accessible 標志設(shè)置為指示的布爾值。
 //值為 true 則指示反射的對象在使用時應(yīng)該取消 Java 語言訪問檢查。
 //值為 false 則指示反射的對象應(yīng)該實施 Java 語言訪問檢查。
   method.setAccessible(true); 
   method1.setAccessible(true);
   
   // 調(diào)用該方法
   method.invoke(tr);
   method1.invoke(tr);
 }

以上這篇Java反射獲取實例的速度對比分析就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 關(guān)于Logback+MyBatis日志輸出問題的一些思考

    關(guān)于Logback+MyBatis日志輸出問題的一些思考

    這篇文章主要介紹了關(guān)于Logback+MyBatis日志輸出問題的一些思考,具有很好的參考價值,希望對大家有所幫助,
    2023-09-09
  • Spring框架中部署log4j.xml的詳細步驟

    Spring框架中部署log4j.xml的詳細步驟

    Log4j是一個常用的日志記錄工具,它可以幫助我們記錄應(yīng)用程序的運行日志并進行靈活的配置,在Spring框架中,我們可以很方便地部署log4j.xml配置文件來管理日志記錄,這篇文章主要介紹了Spring框架中部署log4j.xml的詳細步驟并提供相應(yīng)的代碼示例,需要的朋友可以參考下
    2023-09-09
  • Java初學者入門之繼承和多態(tài)

    Java初學者入門之繼承和多態(tài)

    Java 面向?qū)ο缶幊逃腥筇匦裕悍庋b、繼承、多態(tài),學好繼承和多態(tài)是面向?qū)ο箝_發(fā)語言中非常重要的一個環(huán)節(jié),這篇文章主要給大家介紹了關(guān)于Java初學者入門之繼承和多態(tài)的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • Springboot實現(xiàn)多數(shù)據(jù)源切換詳情

    Springboot實現(xiàn)多數(shù)據(jù)源切換詳情

    這篇文章主要介紹了Springboot實現(xiàn)多數(shù)據(jù)源切換詳情,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,感興趣的朋友可以參考一下
    2022-09-09
  • 詳解Java Selenium中的鼠標控制操作

    詳解Java Selenium中的鼠標控制操作

    本文主要講解如何用java Selenium 控制鼠標在瀏覽器上的操作方法。主要列舉的代碼示例,大家可以自己上代碼執(zhí)行操作看效果,希望對大家有所幫助
    2023-01-01
  • SpringCloud學習筆記之SpringCloud搭建父工程的過程圖解

    SpringCloud學習筆記之SpringCloud搭建父工程的過程圖解

    SpringCloud是分布式微服務(wù)架構(gòu)的一站式解決方案,十多種微服務(wù)架構(gòu)落地技術(shù)的集合體,俗稱微服務(wù)全家桶,這篇文章主要介紹了SpringCloud學習筆記(一)搭建父工程,需要的朋友可以參考下
    2021-10-10
  • IDEA如何開啟并配置services窗口

    IDEA如何開啟并配置services窗口

    在使用IntelliJ IDEA時,可能會遇到Services窗口不自動彈出的情況,本文介紹了如何手動開啟Services窗口的簡單步驟,首先,通過點擊菜單欄中的“視圖”->“工具窗口”->“服務(wù)”,或使用快捷鍵Alt+F8(注意快捷鍵可能存在沖突)來打開Services窗口
    2024-10-10
  • SpringBoot使用前綴樹實現(xiàn)敏感詞過濾示例

    SpringBoot使用前綴樹實現(xiàn)敏感詞過濾示例

    最近項目用到了敏感詞過濾,本文主要就來介紹一下SpringBoot使用前綴樹實現(xiàn)敏感詞過濾示例,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • Spring中@PathVariable和@RequestParam注解的用法區(qū)別

    Spring中@PathVariable和@RequestParam注解的用法區(qū)別

    這篇文章主要介紹了Spring中@PathVariable和@RequestParam注解的用法區(qū)別,@PathVariable 是 Spring 框架中的一個注解,用于將 URL 中的變量綁定到方法的參數(shù)上,它通常用于處理 RESTful 風格的請求,從 URL 中提取參數(shù)值,并將其傳遞給方法進行處理,需要的朋友可以參考下
    2024-01-01
  • Java生成表格圖片的實例代碼

    Java生成表格圖片的實例代碼

    這篇文章主要介紹了Java生成表格圖片的實例代碼,幫助大家更好的理解和學習Java,感興趣的朋友可以了解下
    2020-09-09

最新評論