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

在Java中如何将类作为参数传递?,java,class,gwt,parameters,Java,Class,Gwt,Parameters,有没有办法在Java中将类作为参数传递并从该类中激发一些方法 void main() { callClass(that.class) } void callClass(???? classObject) { classObject.somefunction // or new classObject() //something like that ? } 我正在使用GoogleWebToolkit,它不支持反射 public void foo(Cla

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

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

void callClass(???? classObject)
{
    classObject.somefunction
    // or 
    new classObject()
    //something like that ?
}
我正在使用GoogleWebToolkit,它不支持反射

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);
        }
    }
如何使用反射调用方法

另请参见

Se这些:

以下是模板方法的说明。

使用

void callClass(Class classObject)
{
   //do something with class
}
类也是一个Java对象,因此您可以使用它的类型来引用它


从中了解更多信息。

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


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

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);
}
publicstaticobjectcallstaticmethod(
//类,该类包含静态方法
最后一节课,
//方法名
最后一个字符串methodName,
//可选方法参数
最终对象…参数)引发异常{
for(最终方法:clazz.getMethods()){
if(method.getName().equals(methodName)){
最终类[]paramTypes=method.getParameterTypes();
if(parameters.length!=paramTypes.length){
继续;
}
布尔兼容=真;
for(int i=0;i

更新:
等等,我刚看到问题上的gwt标签。您不能在GWT中使用反射,因为您说过GWT不支持反射。您应该使用延迟绑定而不是反射,或者使用第三方库,例如gwt层的反射支持 在工厂中使用类可以通过多种方式完成,最显著的是通过拥有一个包含实现所需接口的类的名称的配置文件。然后,工厂可以从类路径中找到该类,并将其构造为指定接口的对象

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

类作为参数。例如

三类:

class TestCar {

    private int UnlockCode = 111;
    protected boolean hasAirCondition = true;
    String brand = "Ford";
    public String licensePlate = "Arizona 111";
}
--

--



类内终端方法hackCar()将类TestCar作为参数。

构造方法以接受它-

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);
}
您还可以限制类的类型,例如,这是我创建的库中的方法之一-

protected Class postExceptionActivityIn;

protected <T extends PostExceptionActivity>  void  setPostExceptionActivityIn(Class <T> postExceptionActivityIn) {
    this.postExceptionActivityIn = postExceptionActivityIn;
}
受保护类postExceptionActivityIn;
受保护的无效setPostExceptionActivityIn(类postExceptionActivityIn){
this.postExceptionActivityIn=postExceptionActivityIn;
}
有关更多信息,请搜索反射和泛型。

将T添加为返回类型对我很有用。Ex与json反序列化

 public static <T> T fromJson(String json, Class<T> classOfT){
     return gson().fromJson(json, classOfT);
 }
publicstatict fromJson(字符串json,类ClassSoft){
返回gson().fromJson(json,classOfT);
}

我如何启动默认构造函数或该类中的某些方法?很抱歉,我忘了添加关于google web工具包的内容,我使用的是google web工具包,它不支持反射。请看,我也想谈谈它的原理!类是Java中的一种数据类型吗?OP明确表示他使用的是不支持反射的GWT。这个问题在我回答之后很久才被编辑。最初的问题没有包含这个暗示。顺便说一句,公认的答案也是指反射。嗯,不,它是以TestCart为例的。asker还想使用类的构造函数。这并不容易,没有人在这里解决这个问题。这篇文章提供了一个选项(阅读所有评论,因为接受的答案不起作用):。不过,它相当混乱,而且您收到的编译器警告表明,他们不希望人们使用Java执行此操作。在Python中更容易:)
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;
}
 public static <T> T fromJson(String json, Class<T> classOfT){
     return gson().fromJson(json, classOfT);
 }