2011-01-25 5 views
4

これはかなりマイナーですが、すべてのクラスの先頭にコピーと貼り付けを行い、次のコード行を変更します。Javaには 'this'の静的バージョンがあります

private static final String TAG = MyClass.class.getName(); 

コピーするたびにMyClassビットを変更する必要はありません。

つまり、私はこれを書いています。

private static final String TAG = this.class.getName(); 

しかし、この時点でこれは明らかにありません。私はその未成年者を知っていますが、私は一般にSOの回答から何かを学び、実際に答えがあるかどうかを調べるだけの良いものを実際に学びました。

+2

JavaのペットPeeveません41 – skaffman

+0

あなたは、有効なクラス名とMyClass.classのためのタイプミスを行う場合にもエラーが発生しやすくなります。何度も私に起こった;-) – PeterMmm

+0

もしあなたがカットアンドペースト「再使用」について不注意なら、 –

答えて

7

あなたはEclipseのテンプレートを定義することができるが、例えば、tagと呼ばれる:

private static final String TAG = ${enclosing_type}.class.getName(); 

次に、タイプtagCtrl+Spaceが続くと、それはこの文を挿入します。

このメソッドを使用して、自分のクラスにロガーを宣言します。また

、現在のスレッドのスタックトレース照会:

private static final String TAG = Thread.currentThread().getStackTrace()[1].getClassName(); 
+0

優秀、ありがとう。 – aronp

+0

+1賢い..... –

+0

getStackTrace()[1]またはgetStackTrace()[0]? – aronp

1

thisは、例えば特定のものを表す。クラスレベルのものについてはクラス名を使用するか、クラス内から呼び出す場合は明示的に呼び出すだけです。

2

残念ながら、これを避ける方法はありません。各クラスのクラストークンを明示的に指定する必要があります。反射は、これに対処するための一般的な方法を提供する可能性がありますが、それほど醜いので、考える価値はありません:-)

+0

THanks thatsは私が思ったものです。 – aronp

+2

リフレクションでは不可能です。あなたはどこかで 'クラス 'で始まらなければなりません、そして、それがすでに最初の問題にさせてください。 – BalusC

1

どのように私は何かのように欲しかったthis.class)が、悲しいことに、

3

醜いハックしかし、これはあなたの現在のクラス名与えます:

プライベート静的文字列タグ=新しいのRuntimeExceptionを()。 getStackTrace()[0] .getClassName();

+1

うん、すべてのファイルのトップにはあまりにも醜いですが、ありがとうございます。 – aronp

1

ユーザードッグベインが現在のThreadのスタックトレースを照会することを提案しました。 一つはClassInfoという名前のクラスにそのコードを動かすかもしれない:私たちは、静的インポートを使用する場合

package util; 

public class ClassInfo { 
    private ClassInfo() {} 
     static public String className() { 
      return Thread.currentThread().getStackTrace()[2].getClassName(); 
    } 
} 

を次に、静的な文脈から、我々はClassInfo.className()または単にclassName()を参照することにより、クラス名を取得することができます。

例:

import static util.ClassInfo.className; 

public class MyClass { 

    public static void main(String[] args) { 
     System.out.println(className()); 
     Inner.print(); 
    } 

    private static class Inner { 
     static void print() { 
      System.out.println(className()); 
     } 
    } 
} 

出力:

 
MyClass 
MyClass$Inner