Java現在のクラス名とメソッド名を取得する実装方法

2220 ワード

Javaが現在のクラス名とメソッド名を取得する実装方法ここでは4つの方法を提供し、比較します.必要なものは参考にしてください.
         各関数をテストするために、各クラス名、関数名を手動で印刷すれば、多くの関数が疲れるので、Javaはすでに自分の関数を記録する準備ができています.
クラス名の取得:

public static void testGetClassName() { 
  //   1:  SecurityManager     getClassContext() 
  String clazzName = new SecurityManager() { 
    public String getClassName() { 
      return getClassContext()[1].getName(); 
    } 
  }.getClassName(); 
  System.out.println(clazzName); 
  //   2:  Throwable   getStackTrace() 
  String clazzName2 = new Throwable().getStackTrace()[1].getClassName(); 
  System.out.println(clazzName2); 
  //   3:         () 
  String clazzName3 = new Object() { 
    public String getClassName() { 
      String clazzName = this.getClass().getName(); 
      return clazzName.substring(0, clazzName.lastIndexOf('$')); 
    } 
  }.getClassName(); 
  System.out.println(clazzName3); 
  //  4:  Thread   getStackTrace() 
  String clazzName4 = Thread.currentThread().getStackTrace()[2].getClassName(); 
  System.out.println(clazzName4); 
} 

 100 w回実行し、
第1の方法:1718 ms第2の方法:4843 ms第3の方法:47 ms第4の方法:6484 ms
比較:
    1)方法1何か使用制限はありますか?    2)メソッド2は異常メカニズムによって呼び出しスタックを取得し、性能が最も悪いが、他のメソッドが持たない機能を提供することができ、メソッド名、行番号などを取得することができる.しかし、このように使うのは多少一般的ではありません.    3)方法3匿名クラスの名前を簡単に分析しただけで、明らかに簡単で、実際には性能も最も高い.    4)方法4感覚と方法3は少し似ていて、方法3より正規化されている
関数名の取得:

public static void testGetFunctionName() { 
    //   1:  Throwable   getStackTrace() 
    String funcName2 = new Throwable().getStackTrace()[1].getMethodName(); 
    System.out.println(funcName2); 
    //  2:  Thread   getStackTrace() 
    String clazzName4 = Thread.currentThread().getStackTrace()[2].getMethodName(); 
    System.out.println(clazzName4);  
  } 

100 w回実行:
1つ目:4856 ms 2つ目:6337 ms 
説明:
1.ExceptionクラスはThrowableに継承されているので、そのgetStackTraceをExceptionで呼び出すところもあるが、実際に呼び出すのはThrowableの2.異なるjdkバージョンでgetStackTraceを呼び出すと得られる配列が異なるので、下付きで何度か試してみるとわかるが、以上はjdk 1.6バージョンである
読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!