2

犬.java

public class Dog extends Animal {
.....

}

Animal.java

public class Animal {

   public static  String getName() {

       String callerClassName = ????; //How to get the class Dog, when I call from TestCase
       return "Animal";
   }
}

TestCase クラスを Dog.getName() に使用する場合、Thread.currentThread().getStackTrace()[1].getClassName() を使用するときに Animal ではなく Dog という className を取得する方法

public class TestCase {
   public static  String getName(){

      return Dog.getName();
   }
}
4

3 に答える 3

3

Javaで子クラス名を取得できますか

あなたがやっている方法ではありません...

メソッドは静的であり、継承の対象ではありません。サブクラスで定義された同じ名前の静的メソッドは、スーパークラス メソッドを隠すことができますが、それらをオーバーライドしません。非表示の静的メソッドは、常に完全修飾名 (つまりAnimal.getName()) で参照できます。

を呼び出すDog.getName()と、コンパイラは単に解決Animal.getName()しているだけです。

参照: SO: 静的メソッドの継承


別の角度から:

Javaで子クラス名を取得できますか

メソッドが非静的に変更されたと仮定すると、Wyzard's responseを参照してください。

于 2012-07-20T01:24:55.823 に答える
3

非静的メソッドの場合、this.getClass()それが呼び出されたオブジェクトの具象クラスを取得するために使用できますが、それは静的メソッドには適用できません。そのように継承された静的メソッドを呼び出すと、サブクラスはまったく関与しないため、情報が得られないと思います。

とにかく、これは設計上の問題の兆候かもしれません。getName()静的メソッドには動的なディスパッチがないため、Dogクラスを呼び出すにはDog、ソース コードで明示的に参照する必要があります。メソッドを呼び出すためにサブクラスを既に知っている必要がある場合、サブクラスの名前を返すメソッドを用意しても意味がありません。

于 2012-07-20T01:25:17.110 に答える
1

いいえ、クラスで静的getNameメソッドを提供しない限り、Dogこれは不可能です。Dog.getName()is が呼び出される静的メソッドへの呼び出しを行ったとしてもAnimal、それは結局のところ宣言されており、 of ではないDogため、呼び出し元クラスは is Animal and notDogです。

これを解決したい場合は、何を達成したいかによって異なります。

  1. クラスで静的getNameメソッドを宣言しますDog
  2. メソッドを非静的にし、問題全体を継承に置きます。メソッドは異なる動作を示します。非表示にする代わりに、継承が適用されます。

Overriding and Hiding Methodsをご覧ください 。役立つ場合があります。

于 2012-07-20T01:25:22.370 に答える