Hãy xem xét đoạn mã sau:Sử dụng java.lang.reflect.getMethod với các phương pháp đa hình
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());
}
}
getMethod()
rõ ràng là không biết rằng một String
có thể làm thức ăn cho một phương pháp mà hy vọng một Object
(trên thực tế, đó là tài liệu nói rằng nó tìm kiếm phương thức với tên được chỉ định và chính xác các loại thông số chính thức giống nhau). Có một cách đơn giản để tìm phương pháp phản xạ, chẳng hạn như getMethod()
, nhưng lấy tính đa hình vào tài khoản, sao cho ví dụ phản chiếu ở trên có thể tìm thấy phương pháp print(Object)
khi được truy vấn với thông số ("print", String.class)
?
tôi lãnh đạo một vấn đề tương tự trong http://stackoverflow.com/questions/2169497/bất ngờ-class-getmethod-hành vi và không có một cách xung quanh làm nó với iterating trên tất cả các đối số và gọi làAssignableTừ – Daff