我有一个关于反思的问题 我想尝试某种eval()方法。所以我可以打个例子:
eval("test('woohoo')");
现在我明白java中没有eval方法,但有反射。我做了以下代码:
String s = "test";
Class cl = Class.forName("Main");
Method method = cl.getMethod(s, String.class);
method.invoke(null, "woohoo");
这完美无缺(当然有一个try,catch块围绕这段代码)。它运行测试方法。但是我想调用多个方法,这些方法都有不同的参数。
我不知道它们是什么参数(所以不仅是String.class)。但这怎么可能呢?怎么样 我可以获取方法的参数类型吗? 我知道以下方法:
Class[] parameterTypes = method.getParameterTypes();
但是这将返回我刚刚选择的方法的parameterTypes!以下声明:
Method method = cl.getMethod(s, String.class);
任何帮助将不胜感激!
答案 0 :(得分:15)
您需要调用Class.getMethods()
并遍历它们以寻找正确的功能。
For (Method method : clazz.getMethods()) {
if (method.getName().equals("...")) {
...
}
}
原因是可能有多个方法具有相同的名称和不同的参数类型(即方法名称被重载)。
getMethods()
返回类中的所有公共方法,包括来自超类的公共方法。另一种选择是Class.getDeclaredMethods()
,它返回该类中的所有方法。
答案 1 :(得分:5)
您可以使用以下方法遍历类的所有方法:
cls.getMethods(); // gets all public methods (from the whole class hierarchy)
或
cls.getDeclaredMethods(); // get all methods declared by this class
for (Method method : cls.getMethods()) {
// make your checks and calls here
}
答案 2 :(得分:2)
您可以使用getMethods()
返回类的所有方法的数组。
在循环内部,您可以检查每个方法的参数。
for(Method m : cl.getMethods()) {
Class<?>[] params = m.getParameterTypes();
...
}
否则,您可以使用getDelcaredMethods()
,这将允许您“查看”私有方法(但不是继承的方法)。请注意,如果要调用私有方法,则必须先在其上应用setAccessible(boolean flag):
for(Method m : cl.getDelcaredMethods()) {
m.setAccessible(true);
Class<?>[] params = m.getParameterTypes();
...
}
答案 3 :(得分:2)
好的,感谢所有在这里回答我问题的人最终解决方案:
import java.lang.reflect.Method;
public class Main {
public static void main(String[] args){
String func = "test";
Object arguments[] = {"this is ", "really cool"};
try{
Class cl = Class.forName("Main");
for (Method method : cl.getMethods()){
if(method.getName().equals(func)){
method.invoke(null, arguments);
}
}
} catch (Exception ioe){
System.out.println(ioe);
}
}
public static void test(String s, String b){
System.out.println(s+b);
}
}