11

Javaを参考に、現在のクラスのクラス名を静的に知りたいです。A は B の親クラスです。現在のクラスのクラス名を含む静的文字列を A (親クラス) に保持したいのですが、この静的文字列が B (子クラス) で参照されている場合は、Bのクラス名。これは可能ですか?

例:

public class Parent {

protected static String MY_CLASS_NAME = ???
.
.
.
}

public class Child extends Parent {

public void testMethod() {
     if (MY_CLASS_NAME.equals(getClass().getName())) {
        System.out.println("We're equal!");
     }
}

}
4

3 に答える 3

9

私が知っている唯一の方法は次のとおりです。親クラスで文字列を受け入れる保護されたコンストラクターを作成します。

class Parent {
    private final String className;
    protected Parent(String className) {
         this.className = className;
    }
}

public class Child extends Parent {
    public Child() {
        super("Child");
    }
}

new Throwable().getStackTrace()ところで、Paren のカストラクタを使用してこれを改善することもできます。この場合、すべての子に自分の名前を親に渡すよう強制する必要さえありません。

class Parent {
    private final String className;
    protected Parent() {
         StackTraceElement[] trace = new Throwable().getStackTrace();
         this.className = trace[1].getClassName();
    }
}
于 2011-01-16T13:45:12.710 に答える
5

いいえ、それは不可能です。静的文字列のコピーは (ClassLoader ごとに) 1 つだけですが、複数のサブクラスを持つことができます。

ただし、(サブ)クラスごとに静的フィールドを作成してから、メソッドを使用できます

public class Child extends Parent {
   private static final String NAME = "some alias";

   @Override
   public String getName() {
       return NAME;
   }
}

これは、リフレクションを回避するために使用できる手法です (名前はクラス名と等しくないことがよくありますが、エイリアスを使用します。文字列の代わりに列挙型でも使用できます)。

于 2011-01-16T13:34:18.470 に答える
1

静的変数を使用して実行することはできませんが、このコードを試してください

  class Parent{
    final String className;
    public Parent(){
     className=this.getClass().getName();
    }
  }

必要なサブクラスに対してそれを行います

于 2011-01-16T13:53:34.627 に答える