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)
参数时找到方法?
该反射教程
建议使用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)
归档时间: |
|
查看次数: |
3045 次 |
最近记录: |