webentwicklung-frage-antwort-db.com.de

Wie übergebe ich eine Klasse als Parameter in Java?

Gibt es eine Möglichkeit, Klasse als Parameter in Java zu übergeben und einige Methoden dieser Klasse auszulösen?

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

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

Ich verwende Google Web Toolkit und es unterstützt keine Reflexion.

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

Methode mit Reflektion aufrufen

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

Siehe auch

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

So rufen Sie die Methode auf:

callingMethod(ClassBeingCalled.class);
38

Verwenden

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

Ein Class ist auch ein Java) - Objekt, sodass Sie anhand seines Typs darauf verweisen können.

Lesen Sie mehr darüber in offizielle Dokumentation .

4
darioo

Ich bin mir nicht sicher, was Sie erreichen wollen, aber Sie sollten in Betracht ziehen, dass das Bestehen einer Klasse möglicherweise nicht das ist, was Sie wirklich tun müssen. In vielen Fällen lässt sich der Umgang mit Klassen wie diesen leicht in ein Factory-Muster eines bestimmten Typs einbetten, und die Verwendung dieses Musters erfolgt über eine Schnittstelle. Hier ist einer von Dutzenden Artikeln zu diesem Muster: http://today.Java.net/pub/a/today/2005/03/09/factory.html

die Verwendung einer Klasse innerhalb einer Factory kann auf verschiedene Arten erfolgen, insbesondere durch eine Konfigurationsdatei, die den Namen der Klasse enthält, die die erforderliche Schnittstelle implementiert. Dann kann die Factory diese Klasse im Klassenpfad finden und als Objekt der angegebenen Schnittstelle konstruieren.

1
Jorel

So etwas ist nicht einfach. Hier ist eine Methode, die eine statische Methode aufruft:

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

pdate: Warten Sie, ich habe gerade das GWT-Tag auf der Frage gesehen. In GWT kann keine Reflektion verwendet werden

1

Konstruieren Sie Ihre Methode, um sie zu akzeptieren.

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

Rufen Sie die Methode

printClassNameAndCreateList(SomeClass.class);

Sie können auch den Klassentyp einschränken. Dies ist beispielsweise eine der Methoden aus einer Bibliothek, die ich erstellt habe.

protected Class postExceptionActivityIn;

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

Weitere Informationen finden Sie unter Reflection und Generics.

0
Joshua Gainey

Wie Sie sagten, unterstützt GWT keine Reflexion. Sie sollten eine verzögerte Bindung anstelle einer Reflektion oder eine Bibliothek eines Drittanbieters wie gwt-ent für die Reflektionsunterstützung auf der gwt-Ebene verwenden.

0
Gursel Koca