2010-03-18 42 views
150

Tôi muốn gọi phương thức main tĩnh. Tôi có đối tượng thuộc loại Class, nhưng tôi không thể tạo một thể hiện của lớp đó và cũng không thể gọi phương thức staticmain.Gọi phương thức tĩnh sử dụng phản chiếu

+3

Hiện chúng tôi mã, xin vui lòng. –

Trả lời

213
// String.class here is the parameter type, that might not be the case with you 
Method method = clazz.getMethod("methodName", String.class); 
Object o = method.invoke(null, "whatever"); 

Trong trường hợp phương pháp này là sử dụng cá nhân getDeclaredMethod() thay vì getMethod(). Và gọi setAccessible(true) trên đối tượng phương thức.

9
String methodName= "..."; 
String[] args = {}; 

Method[] methods = clazz.getMethods(); 
for (Method m : methods) { 
    if (methodName.equals(m.getName())) { 
     // for static methods we can use null as instance of class 
     m.invoke(null, new Object[] {args}); 
     break; 
    } 
} 
+10

Tại sao không sử dụng getMethod với tên chính xác thay vì lặp qua tất cả các phương thức? – mjaggard

+9

Đôi khi nó dễ dàng hơn nhiều để lặp và tìm phương thức theo tên hơn để sử dụng getMethod vì getMethod (hoặc getDeclaredMethod) yêu cầu bạn làm việc ra các kiểu tham số một cách chi tiết. Nó chỉ phụ thuộc nếu vấn đề hiệu quả vi mô - Java lặp lại rất nhanh, trừ khi bạn đang gọi phương thức hàng triệu lần trong một số vòng lặp bên trong thì lặp lại sẽ đủ nhanh –

+2

Ngoài ra trong một tình huống thực tế hơn, bạn sẽ chỉ tìm thấy phương pháp một lần ngay cả khi bạn sẽ sử dụng sự phản chiếu để gọi nó nhiều lần. Vì vậy, thêm chi phí khi tìm thấy nó là không quan trọng. – RenniePet

34

Từ Javadoc của Method.invoke():

Nếu phương thức cơ bản là tĩnh, thì đối số obj được chỉ định bị bỏ qua. Nó có thể là null.

gì xảy ra khi bạn

 
Class klass = ...; 
Method m = klass.getDeclaredMethod(methodName, paramtypes); 
m.invoke(null, args) 
Các vấn đề liên quan