Java,获取包含类的类对象,而不是运行时类

Java,获取包含类的类对象,而不是运行时类,java,reflection,oop,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 (Wro

考虑一下这段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)
A类{
//@返回包含此方法的类对象
//在这种情况下,应该是
公共类别f(){
返回getClass();
}
}
类B扩展了{}
B=新的B();
System.out.println(b.f());
//输出--B.class(错误,应为A.class)

f()。我正在寻找一种方法来获取
类的
对象
对象
f()
在里面(显然没有明确提到
a

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

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

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

我不得不说,按照@mmyers的建议,简单地返回一个.class会更简单、更清晰。如果您实际上不需要运行时值,那么尝试在运行时派生它没有多大意义。出现的唯一问题是,如果重构了类的名称,并且在同一个包中碰巧存在另一个同名的类


为了现在代码的清晰性,我会抓住这个机会。

newobject(){}.getClass().getenclosuringclass()
。但是请不要

我知道你说过你不想明确提到一个类

class A {        
    public Class<?> f() {
        return A.class;
    }   
}
A类{
公共类别f(){
返回A.class;
}   
}

但是我正在努力寻找一个上面的代码不令人满意的用例。

获取stacktrace不需要异常。这是一种更好的方法:Thread.currentThread().getStackTrace()。实际上,这不起作用。Thread.currentThread().getStackTrace()使用线程自己的方法(dumpThreads()和getStackTrace()本身)填充堆栈跟踪,尽管它可能因JVM版本/实现而异。唯一的区别是线程的堆栈跟踪还有一个元素。只需使用getStackTrace()[1];Java1.5中还有两个元素;这可能会因实施情况的不同而有所变化。现在,您完全可以通过堆栈跟踪排除类为java.lang.Thread的所有元素,但在这一点上,它不再简单和优雅;使用异常似乎更容易。这只适用于公共方法;另外,处理参数相当麻烦。你们都是对的。使用堆栈跟踪的方法可能更好。当然,它应该是getClass(固定的)。然而,f不必是最终的。为什么要这样?为什么你不想明确地提到一个问题
A.class
似乎是最简单的解决方案。我认为,如果您必须在运行时确定实例的确切类型,这将发出一个强烈的信号,即需要进行一些重构或重新思考。衍生答案过于复杂化了。