167 votes

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

Existe-t-il un moyen de passer une classe comme paramètre en Java et de déclencher certaines méthodes 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.

151voto

Jigar Joshi Points 116533
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 invoquer 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

47voto

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 de cette façon :

callingMethod(ClassBeingCalled.class);

22voto

Joshua Gainey Points 151

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, voici l'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 et Generics.

3voto

darioo Points 23903

Utilisez

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

A Class est également un objet Java, vous pouvez donc y faire référence en utilisant son type.

Pour en savoir plus, consultez documentation officielle .

2voto

Sean Patrick Floyd Points 109428

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 : Attends, je viens de voir le tag gwt sur la question. Vous ne pouvez pas utiliser la réflexion dans GWT

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X