如何在Java中将类作为参数传递?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Java中将类作为参数传递?相关的知识,希望对你有一定的参考价值。

有没有办法在Java中将类作为参数传递并从该类中激活一些方法?

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

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

我使用的是Google Web Toolkit,它不支持反射。

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

如何使用反射调用方法

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

另见

另一答案

作为参数的类。例。

三个班:

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

}

在类Terminal方法中,hackCar()将类TestCar作为参数。

另一答案
public void callingMethod(Class neededClass) {
    //Cast the class to the class you need
    //and call your method in the class
    ((ClassBeingCalled)neededClass).methodOfClass();
}

要调用该方法,请按以下方式调用它:

callingMethod(ClassBeingCalled.class);
另一答案

使用

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

Class也是一个Java对象,因此您可以使用它的类型来引用它。

official documentation了解更多信息。

另一答案

这种事情并不容易。这是一个调用静态方法的方法:

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

更新:等等,我刚看到问题上的gwt标签。你不能在GWT中使用反射

另一答案

我不确定你想要完成什么,但你可能想要考虑通过课程可能不是你真正需要做的。在许多情况下,处理类似这样的类很容易封装在某种类型的工厂模式中,并且通过接口来完成它的使用。这是关于这种模式的数十篇文章之一:http://today.java.net/pub/a/today/2005/03/09/factory.html

在工厂中使用类可以通过多种方式完成,最明显的是通过使用包含实现所需接口的类的名称的配置文件。然后工厂可以从类路径中找到该类,并将其构造为指定接口的对象。

另一答案

正如你所说GWT不支持反射。您应该使用延迟绑定而不是反射,或者使用gwt-ent等第三方库作为gwt图层的反射支持。

另一答案

构建你的方法来接受它 -

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

打电话给方法 -

printClassNameAndCreateList(SomeClass.class);

您也可以限制类的类型,例如,这是我制作的库中的一种方法 -

protected Class postExceptionActivityIn;

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

有关更多信息,请搜索Reflection和Generics。

另一答案

这些:http://download.oracle.com/javase/tutorial/extra/generics/methods.html

这是模板方法的解释。

另一答案

看看Java的反射教程和反射API:

https://community.oracle.com/docs/DOC-983192enter link description here

http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html

以上是关于如何在Java中将类作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何在python类中将方法名称作为参数传递

如何在 WCF Rest Service 中将类对象作为参数传递

如何在Java中将泛型对象作为方法参数传递? [复制]

在java中将函数作为参数传递

如何在java方法中将数组作为参数传递?

如何在汇编函数中将元素数组作为参数传递时转发ARM寄存器的地址指针