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

有没有什么方法可以在 Java 中将类作为参数传递并从该类中激发一些方法?

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


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

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

420157 次浏览
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);
}
}
}

也请看

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

下面是对模板方法的解释。

使用

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

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

阅读更多关于它从 正式文件

这并不容易,下面是一个调用静态方法的方法:

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 不支持反射。应该使用延迟绑定而不是反射,或者使用第三方库(如 Gwt-ent)在 gwt 层提供反射支持。

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

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

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

--

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

有关更多信息,请搜索反射和泛型。

添加 < T > T 作为返回类型对我来说很有用

 public static <T> T fromJson(String json, Class<T> classOfT){
return gson().fromJson(json, classOfT);
}