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

Existe-t-il un moyen de passer la classe en tant que 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 supporte pas la réflexion.

102
demandé sur Michael Dorner 2011-02-02 12:59:53

9 réponses

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 la méthode en utilisant reflection

 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

95
répondu Jigar Joshi 2016-05-03 04:37:58
public void callingMethod(Class neededClass) {
    //Put your codes here
}

Pour appeler la méthode, vous l'appelez de cette façon:

callingMethod(ClassBeingCalled.class);
33
répondu Olanrewaju O. Joseph 2015-10-29 15:45:23

Utiliser

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 de documentation officielle .

4
répondu darioo 2011-02-02 10:04:46

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 l'étiquette gwt sur la question. Vous ne pouvez pas utiliser la réflexion dans GWT

1
répondu Sean Patrick Floyd 2011-02-02 10:15:19

Je ne suis pas sûr de ce que vous essayez d'accomplir, mais vous voudrez peut-être considérer que passer une classe peut ne pas être ce que vous devez vraiment faire. Dans de nombreux cas, traiter avec une classe comme celle-ci est facilement encapsulé dans un modèle d'usine d'un certain type et l'utilisation de cela se fait via une interface. voici l'une 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 effectuée dans un variété de façons, notamment en ayant un fichier de configuration qui contient le nom de la classe qui implémente l'interface requise. Ensuite, l'usine peut trouver cette classe à partir du chemin de classe et la construire en tant qu'objet de l'interface spécifiée.

1
répondu Jorel 2011-02-02 17:22:37

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

0
répondu Gursel Koca 2011-02-02 12:50:16

Classe comme paramater. Exemple.

Trois classes:

class TestCar {

    private int UnlockCode = 111;
    protected boolean hasAirCondition = true;
    String brand = "Ford";
    public String licensePlate = "Arizona 111";
}

--

class Terminal {

public void hackCar(TestCar car) {
     System.out.println(car.hasAirCondition);
     System.out.println(car.licensePlate);
     System.out.println(car.brand);
     }
}

--

class Story {

    public static void main(String args[]) {
        TestCar testCar = new TestCar();
        Terminal terminal = new Terminal();
        terminal.hackCar(testCar);
    }

}

Dans la méthode de Terminal de classe hackCar () prendre la classe TestCar comme paramètre.

0
répondu romangorbenko.com 2018-07-01 15:18:49

Se ces: http://download.oracle.com/javase/tutorial/extra/generics/methods.html

Voici L'explication des méthodes de modèle.

-1
répondu Harold SOTA 2011-02-02 10:03:20
-1
répondu Marcus Gründler 2017-05-25 20:23:15