考虑这个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()
)
答案 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;
}
}
但是我很难找到一个上述代码不能令人满意的用例。