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