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