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()时如何获取className Dog而不是Animal.getStackTrace()[1] .getClassName()
public class TestCase {
public static String getName(){
return Dog.getName();
}
}
答案 0 :(得分:3)
我可以在Java中获取子类名
不是你这样做的方式......
您的方法是静态的,不受继承的约束。在子类中定义的相同名称的静态方法可以隐藏超类方法,但它们不会覆盖它们。隐藏的静态方法总是可以通过它的完全限定名称来引用(即Animal.getName()
)。
当您调用Dog.getName()
时,编译器只是为您解析Animal.getName()
。
另请参阅:SO: Inheritance in Static Methods。
从不同的角度来看:
我可以在Java中获取子类名
假设您的方法已更改为非静态方法,请参阅Wyzard's response。
答案 1 :(得分:2)
对于非静态方法,可以使用this.getClass()
来获取调用它的对象的具体类,但这不适用于静态方法。当您调用这样的继承静态方法时,子类根本不涉及,所以我认为这些信息不可用。
但这可能是设计问题的一个标志。由于静态方法没有动态调度,要在getName()
类上调用Dog
,您必须在源代码中明确引用Dog
。当你必须知道子类已经以便在其上调用方法时,有一个返回子类名称的方法没什么意义。
答案 2 :(得分:1)
不,除非您在getName
课程中提供静态Dog
方法,否则这是不可能的。即使你调用了Dog.getName()
,也会调用Animal
的静态方法,它毕竟是声明的,而不是Dog
,因此调用者类是 Animal
而非Dog
。
如果你想解决这个问题,那取决于你想要达到的目标,你可以:
getName
课程中声明静态Dog
方法。你应该看看Overriding and Hiding Methods,这可能会有帮助。