Come faccio a passare una classe come parametro in Java?


C'è un modo per passare la classe come parametro in Java e attivare alcuni metodi da quella classe?

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

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

Sto usando Google Web Toolkit e non supporta la riflessione.

Author: Michael Dorner, 2011-02-02

9 answers

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

Come richiamare il metodo usando 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);
         }
      }
   }

Vedere anche

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

Per chiamare il metodo, lo chiami in questo modo:

callingMethod(ClassBeingCalled.class);
 33
Author: Olanrewaju O. Joseph, 2015-10-29 15:45:23

Utilizzare

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

Un Class è anche un oggetto Java, quindi puoi fare riferimento ad esso usando il suo tipo.

Per saperne di più da documentazione ufficiale.

 4
Author: darioo, 2011-02-02 10:04:46

Questo genere di cose non è facile. Ecco un metodo che chiama un metodo statico:

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

Aggiornamento: Aspetta, ho appena visto il tag gwt sulla domanda. Non è possibile utilizzare la riflessione in GWT

 1
Author: Sean Patrick Floyd, 2011-02-02 10:15:19

Non sono sicuro di cosa stai cercando di realizzare, ma potresti voler considerare che passare una classe potrebbe non essere ciò che devi veramente fare. In molti casi, trattare con Classe come questa è facilmente incapsulato all'interno di un modello di fabbrica di qualche tipo e l'uso di ciò avviene attraverso un'interfaccia. ecco una delle decine di articoli su questo modello: http://today.java.net/pub/a/today/2005/03/09/factory.html

L'utilizzo di una classe all'interno di una factory può essere realizzato in un varietà di modi, in particolare avendo un file di configurazione che contiene il nome della classe che implementa l'interfaccia richiesta. Quindi la factory può trovare quella classe all'interno del percorso della classe e costruirla come oggetto dell'interfaccia specificata.

 1
Author: Jorel, 2011-02-02 17:22:37

Come hai detto GWT non supporta la riflessione. È necessario utilizzare il binding differito invece di reflection o una libreria di terze parti come gwt-ent per il supporto di reflection al livello gwt.

 0
Author: Gursel Koca, 2011-02-02 12:50:16

Classe come paramater. Esempio.

Tre classi:

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

}

In class Terminal method hackCar() prendi class TestCar come parametro.

 0
Author: romangorbenko.com, 2018-07-01 15:18:49

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

Ecco la spiegazione per i metodi template.

 -1
Author: Harold SOTA, 2011-02-02 10:03:20