使用java.lang.reflect.getMethod和多态方法

Joo*_*kka 8 java reflection polymorphism

请考虑以下代码段:

public class ReflectionTest {

    public static void main(String[] args) {

        ReflectionTest test = new ReflectionTest();
        String object = new String("Hello!");

        // 1. String is accepted as an Object
        test.print(object);

        // 2. The appropriate method is not found with String.class
        try {
            java.lang.reflect.Method print
                = test.getClass().getMethod("print", object.getClass());
            print.invoke(test, object);
        } catch (Exception ex) {
            ex.printStackTrace(); // NoSuchMethodException!
        }
    }

    public void print(Object object) {
        System.out.println(object.toString());
    }

}
Run Code Online (Sandbox Code Playgroud)

getMethod()显然不知道a String可以被提供给一个期望的方法Object(事实上​​,它的文档说它寻找具有指定名称和完全相同的形式参数类型的方法).

是否有一种直接的方法来反复查找方法,就像getMethod()这样,但考虑到多态性,以便上面的反射示例可以print(Object)在查询("print", String.class)参数时找到方法?

sta*_*ker 8

反射教程

建议使用Class.isAssignableFrom()样本进行发现print(String)

    Method[] allMethods = c.getDeclaredMethods();
    for (Method m : allMethods) {
        String mname = m.getName();
        if (!mname.startsWith("print") {
            continue;
        }
        Type[] pType = m.getGenericParameterTypes();
        if ((pType.length != 1)
            || !String.class.isAssignableFrom(pType[0].getClass())) {
            continue;
        }
     }
Run Code Online (Sandbox Code Playgroud)