3

特定のメソッドの実装がどのクラスから継承されているかを調べることはできますか? たとえば、現在のオブジェクトで、どの toString() 実装が使用されているか、Object クラスから、または他の親クラスから?

4

1 に答える 1

7

試すMethod.getDeclaringClass()( 1.5 API へのリンク)

public Class<?> getDeclaringClass()

この Method オブジェクトによって表されるメソッドを宣言するクラスまたはインターフェイスを表す Class オブジェクトを返します。

定義: インタフェース Member 内の getDeclaringClass

戻り値: 基になるメンバーの宣言クラスを表すオブジェクト


実装クラスが以下を呼び出すだけかどうかはわからないことに注意してくださいsuper

public String toString() {
    return super.toString();
}

メソッドの継承元のクラスを特定するには、次のことを行う必要があります。

class.getMethod("myMethod").getDeclaringClass();

例:

public static void main(String[] args) throws Exception {
  System.out.println(String.class.getMethod("toString").getDeclaringClass());
  System.out.println(ArrayList.class.getMethod("toString").getDeclaringClass());
  System.out.println(Area.class.getMethod("toString").getDeclaringClass());
}

出力:

class java.lang.String
class java.util.AbstractCollection
class java.lang.Object

メソッドをオーバーライドするスーパークラスがあればそれを取得したいという質問に気づきました。ここにデモがあります:

import java.lang.reflect.Method;

public class ReflectionCode {
    public static void main(String[] args) throws SecurityException, NoSuchMethodException, ClassNotFoundException {
        System.out.println(getInheritedClass(Parent.class.getName(),"overRiddenMethod"));
        System.out.println(getInheritedClass(Child.class.getName(),"overRiddenMethod"));
    }

    public static String getInheritedClass(String className, String method){
        Class clazz;
        try {
            clazz = Class.forName(className);

            if(clazz.getSuperclass() != null && clazz.getSuperclass().getMethod(method) != null)
            {
                return clazz.getSuperclass().getName();
            }
        }catch(Exception e){

        }
        return "none";
    }
}

class Parent  {

    public void overRiddenMethod(){

    }
}

class Child extends Parent {

    public void overRiddenMethod() {

    }
}
于 2012-04-05T12:10:41.303 に答える