2013-07-05 51 views
4

得到所谓的类名我有这样定义了两个类:的Java:从静态方法

class A { 
    public static String getName(){ 
     Class c = getCalledClass(); 
     return c.getSimpleName(); 
    } 
} 

class B extends A { 
    //no methods are defined here! 
} 

我想知道是否有可能构成static方法getCalledClass()这样调用A.getName()将返回AB.getName()将返回B

谢谢。

+3

传递调用类作为参数 – m0skit0

+0

更简单,更快更简单 - 当然,但是B.getName(B.class)不如B.getName()更直观 - 如果没有其他解决方案,这就是我将最终做.. – bennyl

+0

在什么情况下被调用的类将会有所不同?就像如果你做B.getName()被调用的类是B,为什么我们需要传递这些数据? – MohamedSanaulla

回答

6

这是不可能的,至少不是您所要求的一般意义。

There is no method B.getName()。虽然你可以在代码中输入它,但它会被编译成相同的字节码到A.getName()(我想你也会得到编译器的警告)。

因此,在运行时,没有办法知道某人如何引用静态方法 - 就像无法告诉调用方使用的是什么局部变量名称一样。

+0

测试编译的代码 - 你是对的..好吧,我想我将不得不请求类作为参数.. 谢谢。 – bennyl

0

我不知道你是否可以按照你的要求去除静电或不静电。如果你可以删除静态并使用多态,那么你可以得到你想要的。以下是我测试的代码示例。

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()); 
    } 
} 
0

堆栈跟踪将只包含该静态方法定义的类的名称。即使您拨打B.method(),您也会在堆栈跟踪中看到A.method()。使用静态方案你不能可靠地提取你想要的信息。

如果您使用非静态方法,那么this将是您正在寻找的类型的实例。

public String getName() { 
    return this.class.getSimpleName(); 
} 
0

当javac编译器找到一个对B.getName()的调用时,它将它解析为A.getName(),并在字节代码中对A.getName()进行静态调用。

java中没有任何机制可以从字节码中推导出源代码中使用的表单。

如果您想将B.getName()设置为与A.getName()不同的方法,您必须在B中定义一个名为getName()的方法。由于在该方法中被调用的类将始终为'B',因此不需要混淆堆栈跟踪或其他机制。但是,一般来说,如果你认为它在点之前很重要,那么可能会有更好的面向对象设计供您使用。