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.
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
public void callingMethod(Class neededClass) {
//Put your codes here
}
Pour appeler la méthode, vous l'appelez de cette façon:
callingMethod(ClassBeingCalled.class);
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 .
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
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.
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.
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.
Se ces: http://download.oracle.com/javase/tutorial/extra/generics/methods.html
Voici L'explication des méthodes de modèle.
Jetez un oeil au tutoriel de réflexion et à l'API de réflexion de Java:
Https://community.oracle.com/docs/DOC-983192entrez description du lien ici
Et
Http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html