2012-05-24 45 views

Trả lời

20

Generics được xoá hoàn toàn tại thời gian biên dịch, họ chỉ cung cấp thông tin bổ sung cho các trình biên dịch để xác định lỗi. Họ không thực sự thay đổi chữ ký của phương thức trong tập tin .class. Điều này có nghĩa là bạn gọi một phương pháp chung bằng cách phản ánh trong Java chính xác giống như cách bạn gọi một phương thức không chung chung trong Java, ngoại trừ thay vì chỉ định một loại T, bạn sẽ chỉ định một loại Object.

Có rất nhiều hướng dẫn về cách gọi một phương pháp thông thường bằng cách phản ánh mà tôi ngần ngại thêm một phương thức khác; tuy nhiên, nếu bạn thực sự cần hướng dẫn cách gọi phương thức bằng cách phản ánh, vui lòng thêm nhận xét bên dưới và tôi sẽ thêm mã cần thiết.

Nếu bạn thấy rằng mọi thứ không hoạt động như mong đợi, bạn luôn có thể chạy javap trên tệp lớp đã biên dịch để xác minh rằng bạn đang sử dụng đúng đối tượng trong danh sách đối số. Có thể là nếu bạn chỉ định chữ ký chung loại <T extends List>, đối tượng tham số kết quả thực sự có thể là đối tượng List.

10

Điều này phù hợp với tôi.

Method method = Person.class.getMethod("print", Object.class); 

method.invoke(new Person(), "this is a string"); 
method.invoke(new Person(), 273); 
method.invoke(new Person(), new Object()); 

in

this is a string 
273 
[email protected] 

Tất nhiên lý thuyết đằng sau này được giải thích đẹp trong @Edwin's answer.

4

Để làm nổi bật những điểm nhất định trong câu trả lời Edwin, nơi chúng tôi đang sử dụng kéo dài trong một kiểu generic: nếu bạn có một lớp học như

GenericHibernateDao<T extends Serializable> 

, và một phương pháp

public T save(T entity) {}; 

để gọi phương pháp lưu bằng cách sử dụng phản ánh bạn phải sử dụng lớp Serializable, tức là, bạn cần phải sử dụng:

Method method = GenericHibernateDao.class.getMethod(methodName, Serializable.class); 

và n ot tham số Object.class làm thông số, vì chúng tôi đang sử dụng

<T extends Serializable> 
Các vấn đề liên quan