2012-11-11 44 views
23

Câu hỏi này đang được hỏi ở mọi nơi trên Google nhưng tôi vẫn gặp sự cố với nó. Đây là những gì tôi đang cố gắng làm. Vì vậy, như tiểu bang tiêu đề của tôi, tôi nhận được một 'đối tượng không phải là một ví dụ của tuyên bố lớp' lỗi. Bất kỳ ý tưởng? Cảm ơn!Phản ánh Java - Đối tượng không phải là trường hợp khai báo lớp

Main.java

Class<?> base = Class.forName("server.functions.TestFunction"); 
Method serverMethod = base.getMethod("execute", HashMap.class); 
serverMethod.invoke(base, new HashMap<String, String>()); 

TestFunction.java

package server.functions; 

import java.util.HashMap; 
import java.util.Map; 

import server.*; 

public class TestFunction extends ServerBase { 

    public String execute(HashMap<String, String> params) 
    { 
     return "Test function successfully called"; 
    } 
} 

Trả lời

37

Bạn đang gọi phương thức với lớp, nhưng bạn cần một phiên bản của lớp đó. Hãy thử điều này:

serverMethod.invoke(base.newInstance(), new HashMap<String, String>()); 
+0

Đã hoạt động hoàn hảo. Cảm ơn – tier1

+0

chỉ là những gì tôi cần, cảm ơn bạn! –

10

Bạn đang cố gắng gọi phương thức execute trên đối tượng base, mà thực sự là một đối tượng Class trả về bởi Class.forName() cuộc gọi của bạn.

Điều này sẽ chỉ hoạt động cho phương thức static (lớp), nhưng execute là phương pháp không tĩnh (ví dụ).

Bạn cần một phiên bản thực tế của TestFunction để gọi phương thức hoặc bạn cần phải thực hiện phương thức static.

Mặc dù phương pháp ví dụ hiện tại của bạn sẽ thực hiện tương tự đối với bất kỳ đối tượng TestFunction nào, nói chung một phương pháp thể hiện có thể tạo ra kết quả khác nhau cho từng đối tượng - vì vậy phương pháp phản chiếu .invoke() cần biết đối tượng nào để chạy phương thức.

+0

Đối với phương pháp tĩnh bạn cũng có thể cung cấp 'null' ... –

+0

Đúng vậy, như mô tả trong [javadoc] (http://docs.oracle.com/javase/6/docs/ api/java/lang/reflect/Method.html # invoke% 28java.lang.Object,% 20java.lang.Object ...% 29). – DNA

+0

Cảm ơn bạn đã giải thích chi tiết. Tôi ước tôi có thể chọn nhiều câu trả lời đúng cho câu hỏi này. – tier1

Các vấn đề liên quan