Java,获取包含类的Class对象,而不是Runtime Class

时间:2009-10-02 00:52:26

标签: java reflection oop

考虑这个Java代码

class A{
 //@returns Class object this method is contained in
 // should be A in this case
 public Class<?> f() {
   return getClass();
 }
}

class B extends A {}

B b = new B();

System.out.println(b.f());
//output -- B.class (Wrong, should be A.class)

f()内我无法使用getClass(),因为这会给我一个runtype,即B。我正在寻找一种方法让Class class的{​​{1}}对象在里面(显然没有明确提及f()

5 个答案:

答案 0 :(得分:6)

new Object() {}.getClass().getEnclosingClass()。但请不要!

答案 1 :(得分:4)

您可以使用异常堆栈跟踪工具执行以下操作:

public String f() {
    Exception E = new Exception();
    E.fillInStackTrace();
    return E.getStackTrace()[0].getClassName(); // load it if you need to return class
}

答案 2 :(得分:2)

我不得不说,简单地返回A.class就像@mmyers建议的那样简单明了。如果您实际上不想要运​​行时值,那么在运行时尝试派生它没有多大意义。出现的唯一问题是,如果您重构类的名称,并且在同一个包中存在同名的另一个。

为了清楚起见,我现在就抓住这个机会了。

答案 3 :(得分:1)

您可以使用

class.getMethod("f",parameterTypes).getDeclaringClass()

答案 4 :(得分:1)

我知道你说你不想明确提到A.class

class A {        
    public Class<?> f() {
        return A.class;
    }   
}

但是我很难找到一个上述代码不能令人满意的用例。