2013-04-25 52 views
0

我想要得到含有帕拉姆类型的方法的阵列的所有元素(Java.reflect动态getted)的所有数组元素,显示器的方法PARAM类型

这里的代码,如果我有2个PARAMS在该方法中:

Method testMethod = c.getMethod(method.getName(), new Class[] {int.class, String.class}); 

但它应该是动态的,所以我用:method.getTypeParameters()返回上的所有类型的PARAM的阵列。

后来,当我写:

Method testMethod = c.getMethod(method.getName(), new Class[] {method.getParameterTypes}); 

,但它给我说:​​类型不匹配:不能从类[]转换到类

的我明白,我必须上环参数,因为我有:

method.getParameterTypes[0] // gives "int" 

method.getParameterTypes[1] // gives "String" 

那么我该如何做到这一点?一个循环可能?你有什么想法吗?谢谢。

+0

是否使用'getParameterTypes()'或'getTypeParameters()'(你同时在本例中)?有一个很大的区别... – NilsH 2013-04-25 18:46:42

+0

我使用'getParameterTypes' – Copernic 2013-04-25 18:49:15

回答

1
Method testMethod = c.getMethod(
    method.getName(), new Class[] {method.getParameterTypes}); 

应该

Method testMethod = c.getMethod(
    method.getName(), method.getParameterTypes()); 

第一个问题是,你错过了()getParameterTypes结束。调用方法时,Java需要显式括号。

第二个问题是,您试图将结果getParameterTypes,Class<?>[]置于Class[]之内。 Class[]唯一可以包含的是单个类,而不是数组,因此只需使用由getParameterTypes()返回的数组。


我不清楚你为什么要这么做。你可以从一个接口获取一个Method,并将它应用到该接口的一个实例上,而无需在实例的具体类上查找该方法。对于抽象类也是如此。除非继承图中存在漏洞或某种奇怪的相应静态方法约定,否则不应使用一个方法签名来获取另一种方法。这些都可能是重构的机会。

您的代码库中的反射越少,人们学习越容易,您将从bug查找程序和其他分析工具获得的里程越多,并且您将获得的不完整类路径问题越少。

+0

谢谢你的作品。这个过程是一个extern应用程序向我发送它的参数和一个ID的方法名称,我需要从一个目录加载一个具有此ID的jar。该jar包含webservice客户端的代理类,最终使用webservice并使用它的pamaters执行该方法。我知道这很令人困惑。 – Copernic 2013-04-25 18:58:29

1

使用Arrays.toString(method.getParameterTypeas())如果你想请参阅的类型。如果你想遍历并使用它们使用循环:

for (Class<?> type : method.getParameterTypeas()) { 
    // use the type 
}