使用Java反射创建eval()方法

时间:2010-04-12 10:20:08

标签: java reflection

我有一个关于反思的问题 我想尝试某种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);

任何帮助将不胜感激!

4 个答案:

答案 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);
  }
}