Java:从静态方法获取被调用的类名
我有两个这样定义的类:Java:从静态方法获取被调用的类名,java,reflection,Java,Reflection,我有两个这样定义的类: class A { public static String getName(){ Class c = getCalledClass(); return c.getSimpleName(); } } class B extends A { //no methods are defined here! } 我想知道是否可以组合静态方法getCalledClass(),这样调用A.getName()将返回A,B.ge
class A {
public static String getName(){
Class c = getCalledClass();
return c.getSimpleName();
}
}
class B extends A {
//no methods are defined here!
}
我想知道是否可以组合静态
方法getCalledClass()
,这样调用A.getName()
将返回A
,B.getName()
将返回B
谢谢。我不知道您是否可以按照您的要求去除静电。如果您可以删除static并使用多态性,那么您就可以得到您想要的。下面是我测试的代码示例
class A {
public String getName(){
Class c = this.getCalledClass();
return c.getSimpleName();
}
Class getCalledClass() {
return A.class;
}
}
class B extends A {
Class getCalledClass() {
return B.class;
}
}
class TestApplication {
public static void main(String[] args) {
A objA = new A();
System.out.println(objA.getName());
A objB = new B();
System.out.println(objB.getName());
}
}
堆栈跟踪将只包含在其上定义静态方法的类的名称。即使调用
B.method()
,也会在堆栈跟踪中看到A.method()
。使用静态方案,您无法可靠地提取所需的信息
如果使用非静态方法,则此
将是您要查找的类型的实例
public String getName() {
return this.class.getSimpleName();
}
这是不可能的,至少在你要求的一般意义上是不可能的 没有方法
B.getName()
。虽然您可以在代码中键入它,但它将被编译成与A.getName()
相同的字节码(我想您也会收到编译器警告)
因此,在运行时,无法知道有人是如何引用静态方法的,就像无法知道调用方使用的是什么局部变量名一样。当javac编译器找到对
B.getName()
的调用时,它会在那里解析它,然后解析为a.getName()
,并对a.getName()进行静态调用
在字节码中
java中不存在任何可以从字节码推断源代码中使用的形式的机制
如果希望
B.getName()
成为与a.getName()
不同的方法,则必须在B
中定义一个名为getName()
的方法。因为在该方法中,被调用的类将始终是“B”,所以不需要混淆堆栈跟踪或其他机制。但是,一般来说,如果您认为dot之前的内容很重要,那么可能会有更好的面向对象设计供您使用。将调用类作为参数传递会更简单更快,对我来说更简单-当然,但是B.getName(B.class)不如B.getName()直观-如果没有其他解决方案,我最终会这么做..在什么情况下被调用的类会有所不同?比如如果你做了B.getName(),被调用的类是B,为什么我们需要传递数据呢?Mohamed,不是-被调用的类将是A,因为它们是静态方法..测试编译后的代码-你是对的。。我想我必须请求类作为参数。。谢谢