2011-02-02 17 views
94

¿Hay alguna manera de pasar la clase como parámetro en Java y desencadenar algunos métodos de esa clase?¿Cómo paso una clase como parámetro en Java?

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

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

Estoy usando Google Web Toolkit y no admite la reflexión.

Respuesta

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); 
     } 
    } 

cómo invocar el método utilizando la reflexión

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); 
     } 
     } 
    } 

también Consulte

+0

y cómo yo fuego constructor por defecto o algunos métodos de esa clase? –

+1

información actualizada ... –

+0

lo siento, me olvidé de agregar sobre el kit de herramientas de google web y esas cosas, estoy usando google web toolkit y no admite la reflexión. –

4

Uso

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

Un Class es también un objeto de Java, por lo que se puede hacer referencia a ella mediante el uso de su tipo.

Más información al respecto desde official documentation.

1

Este tipo de cosas no es fácil. Aquí es un método que llama a un método estático:

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); 
} 

Actualización: Espera, acabo de ver la etiqueta GWT sobre la cuestión. No puede usar la reflexión en GWT

+0

cualquier solución para gwt? –

0

Como dijo GWT no admite la reflexión. Debe utilizar el enlace diferido en lugar de la reflexión o una biblioteca de terceros, como gwt-ent para el soporte de reflexión en la capa de gwt.

1

No estoy seguro de lo que está tratando de lograr, pero es posible que desee considerar que aprobar una clase puede no ser lo que realmente necesita hacer. En muchos casos, tratar con Clase de este tipo se encapsula fácilmente dentro de un patrón de fábrica de algún tipo y el uso de eso se hace a través de una interfaz.aquí está uno de los artículos sobre ese patrón docenas: http://today.java.net/pub/a/today/2005/03/09/factory.html

usando una clase dentro de una fábrica se puede lograr en una variedad de maneras, lo más notablemente posible por tener un archivo de configuración que contiene el nombre de la clase que implementa la interfaz requerida. Entonces la fábrica puede encontrar esa clase desde dentro de la ruta de la clase y construirla como un objeto de la interfaz especificada.

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

para llamar al método, se llama de esta manera:

callingMethod(ClassBeingCalled.class); 
Cuestiones relacionadas