2011-02-02 32 views
94

Có cách nào để chuyển lớp như một tham số trong Java và kích hoạt một số phương thức từ lớp đó không?Làm thế nào để chuyển một lớp như một tham số trong Java?

void main() 
{ 
    callClass(that.class) 
} 

void callClass(???? classObject) 
{ 
    classObject.somefunction 
    // or 
    new classObject() 
    //something like that ? 
} 

Tôi đang sử dụng Bộ công cụ web của Google và nó không hỗ trợ phản ánh.

Trả lời

90
public void foo(Class c){ 
     try { 
      Object ob = c.newInstance(); 
     } catch (InstantiationException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

Làm thế nào để gọi phương pháp sử dụng phản ánh

import java.lang.reflect.*; 


    public class method2 { 
     public int add(int a, int b) 
     { 
     return a + b; 
     } 

     public static void main(String args[]) 
     { 
     try { 
      Class cls = Class.forName("method2"); 
      Class partypes[] = new Class[2]; 
      partypes[0] = Integer.TYPE; 
      partypes[1] = Integer.TYPE; 
      Method meth = cls.getMethod(
       "add", partypes); 
      method2 methobj = new method2(); 
      Object arglist[] = new Object[2]; 
      arglist[0] = new Integer(37); 
      arglist[1] = new Integer(47); 
      Object retobj 
       = meth.invoke(methobj, arglist); 
      Integer retval = (Integer)retobj; 
      System.out.println(retval.intValue()); 
     } 
     catch (Throwable e) { 
      System.err.println(e); 
     } 
     } 
    } 

Ngoài Xem

+0

và làm thế nào để bắn constructor mặc định hoặc một số phương pháp trong lớp đó? –

+1

thông tin cập nhật ... –

+0

xin lỗi tôi quên thêm về bộ công cụ web google và các công cụ, im sử dụng bộ công cụ web google và nó không hỗ trợ phản ánh. –

4

Sử dụng

void callClass(Class classObject) 
{ 
    //do something with class 
} 

Một Class cũng là một đối tượng Java, vì vậy bạn có thể tham khảo nó bằng cách sử dụng loại của nó.

Đọc thêm về điều này từ official documentation.

1

Kiểu này mà không phải là dễ dàng. Dưới đây là một phương pháp mà các cuộc gọi một phương pháp tĩnh:

public static Object callStaticMethod(
    // class that contains the static method 
    final Class<?> clazz, 
    // method name 
    final String methodName, 
    // optional method parameters 
    final Object... parameters) throws Exception{ 
    for(final Method method : clazz.getMethods()){ 
     if(method.getName().equals(methodName)){ 
      final Class<?>[] paramTypes = method.getParameterTypes(); 
      if(parameters.length != paramTypes.length){ 
       continue; 
      } 
      boolean compatible = true; 
      for(int i = 0; i < paramTypes.length; i++){ 
       final Class<?> paramType = paramTypes[i]; 
       final Object param = parameters[i]; 
       if(param != null && !paramType.isInstance(param)){ 
        compatible = false; 
        break; 
       } 

      } 
      if(compatible){ 
       return method.invoke(/* static invocation */null, 
        parameters); 
      } 
     } 
    } 
    throw new NoSuchMethodException(methodName); 
} 

Cập nhật: Chờ, tôi chỉ thấy thẻ gwt về câu hỏi này. Bạn không thể sử dụng phản ánh trong GWT

+0

bất kỳ giải pháp cho gwt? –

0

Như bạn đã nói GWT không hỗ trợ phản chiếu. Bạn nên sử dụng ràng buộc hoãn lại thay vì phản chiếu hoặc thư viện của bên thứ ba chẳng hạn như gwt-ent để hiển thị phản chiếu ở lớp gwt.

1

Tôi không chắc chắn những gì bạn đang cố gắng hoàn thành, nhưng bạn có thể muốn xem xét việc vượt qua một lớp học có thể không phải là những gì bạn thực sự cần phải làm. Trong nhiều trường hợp, đối phó với Class như thế này được dễ dàng đóng gói trong một mẫu nhà máy của một số loại và việc sử dụng nó được thực hiện thông qua một giao diện.đây là một trong hàng chục bài viết về mẫu đó: http://today.java.net/pub/a/today/2005/03/09/factory.html

sử dụng một lớp trong một nhà máy có thể được thực hiện theo nhiều cách, đáng chú ý nhất là có tệp cấu hình chứa tên của lớp thực hiện giao diện được yêu cầu. Sau đó, nhà máy có thể tìm thấy lớp đó từ bên trong đường dẫn lớp và xây dựng nó như là một đối tượng của giao diện được chỉ định.

27
public void callingMethod(Class neededClass) { 
    //Put your codes here 
} 

Để gọi phương thức, bạn gọi nó theo cách này:

callingMethod(ClassBeingCalled.class); 
Các vấn đề liên quan