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

安全劍客發表於2020-10-14
這篇文章主要介紹了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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章