如何在Java中传递一个类作为参数?
有什么办法在Java中传递类作为参数,并从该类中引发一些方法?
void main() { callClass(that.class) } void callClass(???? classObject) { classObject.somefunction // or new classObject() //something like that ? }
我正在使用Google Web Toolkit,但不支持reflection。
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); } }
- 以下是Reflection API的一些很好的例子
如何使用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); } } }
另见
- Javareflection
public void callingMethod(Class neededClass) { //Put your codes here }
要调用该方法,可以这样调用它:
callingMethod(ClassBeingCalled.class);
使用
void callClass(Class classObject) { //do something with class }
一个Class
也是一个Java对象,所以你可以使用它的types来引用它。
从官方文档中了解更多信息。
这种事情不容易。 这是一个调用静态方法的方法:
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中使用reflection
我不确定你想要完成什么,但是你可能要考虑,通过一个class级可能不是你真正需要做的事情。 在许多情况下,像这样处理类很容易被封装在某种types的工厂模式中,并且通过一个接口来完成。 这是几十篇关于这种模式的文章之一: http : //today.java.net/pub/a/today/2005/03/09/factory.html
在工厂内使用类可以通过多种方式来完成,最显着的是通过一个包含实现所需接口的类的名称的configuration文件。 然后工厂可以从类path中find该类,并将其构造为指定接口的对象。
正如你所说,GWT不支持反思。 您应该使用延迟绑定而不是reflection或第三方库(如gwt-ent)来reflectionsuppport在gwt层。
看看Java的reflection教程和reflectionAPI:
https://community.oracle.com/docs/DOC-983192 在此处input链接描述
和
http://docs.oracle.com/javase/6/docs/api/java/lang/Class.html
Se这些: http : //download.oracle.com/javase/tutorial/extra/generics/methods.html
这里是模板方法的解释。