获取实现对象方法的类

Ria*_*iaD 4 java reflection

我有一个对象object,我将称之为方法toString.我怎么知道这个方法最后在什么类中实现?

例如,如果我们有层次结构:

class A /*extends Object */{                                                                                                              

}                                                                                                                      
class B extends A{                                                                                                              
    public String toString() {                                                                                         
        return "representation";                                                                                       
    }                                                                                                                  
}                                                                                                                      
class C extends B{                                                                                                              
}                                                                                                                      
class D extends C{                                                                                                              
}                                                                                                                      
Run Code Online (Sandbox Code Playgroud)

和对象

Object object = new SomeClass(); //(A/B/C/D/Object)                                                                                
Run Code Online (Sandbox Code Playgroud)

然后toString()我应该得到ObjectObjectABB,CD

And*_*ter 6

您可以使用以下Method.getDeclaringClass()方法:

...
private Class<?> definingClass(Class<?> clz, String method) throws NoSuchMethodException, SecurityException {
    Method m = clz.getMethod(method);
    return m.getDeclaringClass();
}

...

System.err.println(definingClass(A.class, "toString"));
System.err.println(definingClass(B.class, "toString"));
System.err.println(definingClass(C.class, "toString"));
System.err.println(definingClass(D.class, "toString"));

...
Run Code Online (Sandbox Code Playgroud)

结果:

class java.lang.Object
class com.example.B
class com.example.B
class com.example.B
Run Code Online (Sandbox Code Playgroud)

definingClass()如果需要查找具有参数的方法,则需要适当地扩展方法.