對比分析Java反射獲取例項的速度
這篇文章主要介紹了Java反射獲取例項的速度對比分析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧 |
之前程式碼有一個邏輯,是在初始化時讀取某個包下的所有class檔案,放入到一個HashMap裡。程式碼執行過程中,透過Key獲取到對應class的全路徑名,最後透過Class.forName(className).getDeclaredConstructor().newInstance()獲取例項物件。
後來同事看到了程式碼,對這個HashMap裡儲存方式提出了建議,之前的Map是完全可以改成
後來我測試了一下兩者例項化一個物件的速度:
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
結論:
Map的value不儲存全路徑名,在初始化的時候Map的value直接儲存Class物件,在反射過程中速度提升很大。
補充知識:java反射獲取類例項並呼叫私有方法
我就廢話不多說了,大家還是直接看程式碼吧~
public class TestReflect {//測試類 public void mPublic() {//訪問許可權最大 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獲取驅動的時候就是用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 標誌設定為指示的布林值。 //值為 true 則指示反射的物件在使用時應該取消 Java 語言訪問檢查。 //值為 false 則指示反射的物件應該實施 Java 語言訪問檢查。 method.setAccessible(true); method1.setAccessible(true); // 呼叫該方法 method.invoke(tr); method1.invoke(tr); }
以上這篇Java反射獲取例項的速度對比分析就是小編分享給大家的全部內容了,希望能給大家一個參考。
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2726799/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- java反射方式建立例項Java反射
- Java的幾種建立例項方法的效能對比Java
- React獲取元件例項React元件
- Java獲取Class物件的方式和例項化物件的方式Java物件
- 獲取當前Tomcat例項的埠Tomcat
- 模型關聯 一對一 獲取關聯模型例項模型
- Java Go python 執行速度對比JavaGoPython
- java高效能反射及效能對比Java反射
- Nacos - 客戶端例項列表獲取客戶端
- JAVA反射舉例Java反射
- 獲取Spring容器中Bean例項的工具類(Java泛型方法實現)SpringBeanJava泛型
- PHP --反射 --獲取類的方法PHP反射
- .NET控制檯獲取依賴注入例項依賴注入
- Java知識點總結(反射-獲取類的資訊)Java反射
- 例項分析JAVA CLASS的檔案結構Java
- 例項分析理解Java位元組碼Java
- MySQL與MongoDB設計例項對比QYMySqlMongoDB
- Angular 使用 Injector API 人工獲取依賴注入的例項AngularAPI依賴注入
- Vue使用Ref跨層級獲取元件例項Vue元件
- 優化 WebView 的載入速度例項優化WebView
- JAVA之反射學習1-如何獲取Class物件Java反射物件
- JAVA之反射學習3-反射獲取成員變數並賦值Java反射變數賦值
- Java 獲取系統各項引數Java
- Java I/O流 複製檔案速度對比Java
- 獲取倒數第幾個元素程式碼例項
- activiti 根據 流程例項ID 獲取發起人
- 反射--Class物件功能--獲取Method反射物件
- c# 類的反射例項 (GetType().Invoke().GetMethod().CreateInstance())C#反射
- C#例項化物件的三種方式及效能對比C#物件
- for迴圈的例項分析
- 【C#】反射的用法及效率對比C#反射
- Bash 指令碼例項:獲取符號連結的目標位置指令碼符號
- Hibernate基於Maven入門例項,與MyBatis比對MavenMyBatis
- Java Class檔案結構例項分析(下)Java
- Java Class檔案結構例項分析(上)Java
- 爬蟲例項-淘寶頁面商品資訊獲取爬蟲
- Java常用的日誌框架對比和分析Java框架
- JAVA之反射學習2-獲取構造方法並使用Java反射構造方法