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,因为它们是静态方法..测试编译后的代码-你是对的。。我想我必须请求类作为参数。。谢谢