我可以用Java获取子类名吗

我可以用Java获取子类名吗,java,Java,Dog.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"; } }

Dog.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()时,如何获得类名Dog而不是Animal

我可以用Java获取子类名吗

不是你这样做的

您的方法是静态的,不受继承的约束。子类中定义的同名静态方法可以隐藏超类方法,但不会重写它们。隐藏的静态方法始终可以由其完全限定名引用(即
Animal.getName()

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

另见:


从另一个角度:

我可以用Java获取子类名吗


假设您的方法已更改为非静态方法,请参见。

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


不过,这可能是一个设计问题的迹象。由于静态方法没有动态调度,要在
Dog
类上调用
getName()
,必须在源代码中明确引用
Dog
。如果您必须知道子类的名称才能调用子类上的方法,那么使用返回子类名称的方法没有多大意义。

否,除非您在
Dog
类中提供静态
getName
方法,否则这是不可能的。即使您调用
Dog.getName()
也会调用
Animal
的静态方法,毕竟它是在这里声明的,而不是
Dog
,因此调用方类是
Animal
而不是
Dog

如果你想解决这个问题,这取决于你想实现什么,你可以:

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

  • 您应该看一下,它可能会有所帮助。

    请注意,您的方法
    getName()
    是静态的,因此不受继承的约束(粗略地说,不确定JLS对此的确切说明,可能会查找它……),也许如果您更好地解释您试图实现的目标,您会得到一个很好的答案。到目前为止,我唯一能建议的就是在Dog类中使用一个只返回“Dog”的静态getName()方法。@henry:嗯?请解释您刚刚发布的内容。另请参阅:。
    public class TestCase {
       public static  String getName(){
    
          return Dog.getName();
       }
    }