web-dev-qa-db-fra.com

Comment passer une classe en tant que paramètre en Java?

Est-il possible de passer la classe en tant que paramètre dans Java et de déclencher des méthodes à partir de cette classe?

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

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

J'utilise Google Web Toolkit et il ne prend pas en charge la réflexion.

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

Comment appeler une méthode en utilisant la réflexion

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

Voir aussi

113
Jigar Joshi
public void callingMethod(Class neededClass) {
    //Cast the class to the class you need
    //and call your method in the class
    ((ClassBeingCalled)neededClass).methodOfClass();
}

Pour appeler la méthode, vous l'appelez comme suit:

callingMethod(ClassBeingCalled.class);
38

Utilisation

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

Un Class est également un objet Java. Vous pouvez donc vous y référer en utilisant son type.

En savoir plus à ce sujet sur documentation officielle .

4
darioo

Je ne suis pas sûr de ce que vous essayez d'accomplir, mais vous voudrez peut-être considérer que réussir un cours n'est peut-être pas ce que vous devez vraiment faire. Dans de nombreux cas, traiter avec une classe telle que celle-ci est facilement encapsulé dans un type de configuration d'usine et son utilisation est effectuée via une interface. voici l'un des dizaines d'articles sur ce modèle: http://today.Java.net/pub/a/today/2005/03/09/factory.html

l'utilisation d'une classe dans une usine peut être réalisée de différentes manières, notamment en disposant d'un fichier de configuration contenant le nom de la classe qui implémente l'interface requise. Ensuite, l’usine peut trouver cette classe dans le chemin de classe et la construire en tant qu’objet de l’interface spécifiée.

1
Jorel

Ce genre de chose n'est pas facile. Voici une méthode qui appelle une méthode statique:

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

Mise à jour: Attendez, je viens de voir la balise gwt sur la question. Vous ne pouvez pas utiliser la réflexion dans GWT

1
Sean Patrick Floyd

Construisez votre méthode pour l'accepter-

public <T> void printClassNameAndCreateList(Class<T> className){
    //example access 1
    System.out.print(className.getName());

    //example access 2
    ArrayList<T> list = new ArrayList<T>();
    //note that if you create a list this way, you will have to cast input
    list.add((T)nameOfObject);
}

Appelez la méthode

printClassNameAndCreateList(SomeClass.class);

Vous pouvez également restreindre le type de classe, par exemple, il s’agit d’une des méthodes d’une bibliothèque que j’ai créée-

protected Class postExceptionActivityIn;

protected <T extends PostExceptionActivity>  void  setPostExceptionActivityIn(Class <T> postExceptionActivityIn) {
    this.postExceptionActivityIn = postExceptionActivityIn;
}

Pour plus d'informations, recherchez Reflection and Generics.

0
Joshua Gainey

Comme vous l'avez dit, GWT ne supporte pas la réflexion. Vous devez utiliser une liaison différée au lieu de réflexion, ou une bibliothèque tierce telle que gwt-ent pour l’aide à la réflexion sur la couche gwt.

0
Gursel Koca