2

狗.java

public class Dog extends Animal {
.....

}

动物.java

public class Animal {

   public static  String getName() {

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

当我对 Dog.getName() 使用 TestCase 类时,当我使用 Thread.currentThread().getStackTrace()[1].getClassName() 时如何获取类名 Dog 而不是 Animal

public class TestCase {
   public static  String getName(){

      return Dog.getName();
   }
}
4

3 回答 3

3

我可以在Java中获取子类名称吗

不是你这样做的方式...

您的方法是静态的,不受继承。子类中定义的同名静态方法可以隐藏超类方法,但不会覆盖它们。隐藏的静态方法总是可以通过它的完全限定名称(即Animal.getName())来引用。

当您调用Dog.getName()时,编译器只是Animal.getName()为您解析。

另请参阅:SO:静态方法中的继承


从另一个角度:

我可以在Java中获取子类名称吗

假设您的方法更改为非静态的,请参阅Wyzard 的响应

于 2012-07-20T01:24:55.823 回答
3

对于非静态方法,您可以使用它this.getClass()来获取调用它的对象的具体类,但这不适用于静态方法。当您像这样调用继承的静态方法时,根本不涉及子类,因此我认为该信息不可用。

无论如何,这可能是设计问题的征兆。因为静态方法没有动态调度,所以要调用你必须在源代码中显式引用getName()的类。当您必须已经知道子类才能在其上调用该方法时,拥有一个返回子类名称的方法没有多大意义。DogDog

于 2012-07-20T01:25:17.110 回答
1

不,除非您在类中提供静态getName方法,否则Dog这是不可能的。即使您调用Dog.getName()了静态方法 of Animalis ,毕竟它是在其中声明的,而不是 of Dog,因此调用者类 Animaland not Dog

如果你想解决这个问题,这取决于你想要实现的目标,你可以:

  1. 在你的类中声明一个静态getName方法。Dog
  2. 使方法成为非静态的并将整个问题放在继承上,其中方法将显示不同的行为。将应用继承而不是隐藏。

你应该看看 Overriding and Hiding Methods,它可能会有所帮助。

于 2012-07-20T01:25:22.370 回答