作为开发小型 ScriptEngine 的一部分,我反思地调用 java 方法。脚本引擎的调用为对象提供了方法名称和参数数组。为了调用该方法,我尝试通过调用 Class.getMethod(name, argument types) 来解决它。
然而,这仅在参数的类和方法预期的类相同时才有效。
Object o1 = new Object();
Object out = System.out;
//Works as System.out.println(Object) is defined
Method ms = out.getClass().getMethod("println",o1.getClass());
Object o2 = new Integer(4);
//Does not work as System.out.println(Integer) is not defined
Method mo = out.getClass().getMethod("println",o2.getClass());
我想知道是否有一种“简单”的方法来获得正确的方法,如果可能的话最适合参数类型,或者我是否必须自己实现。
最接近的拟合是:
Object o1 = new Integer(1);
Object o2 = new String("");
getMethod(name, o1.getClass())//println(Object)
getMethod(name, o2.getClass())//println(String)
更新:
澄清我需要什么:脚本引擎是我在空闲时间编写的一个小项目,所以没有我必须遵循的严格规则。所以我认为选择从引擎调用的方法就像java编译器在编译时选择方法一样,只有动态类型而不是对象的静态类型才会起作用。(有或没有自动装箱)
这是我首先希望的Class.getMethod() 会解决。但是 Class.getMethod() 需要与方法声明的参数类型完全相同的类,使用子类将导致无此类方法异常。这可能有充分的理由发生,但使该方法对我来说毫无用处,因为我事先不知道哪些参数类型适合。
另一种方法是调用 Class.getMethods() 并遍历返回的数组并尝试找到合适的方法。然而,如果我不只是想采用我遇到的第一个“好”方法,这将是复杂的,所以我希望有一个至少可以处理的现有解决方案:
- 最接近的拟合:如果 arg.getClass() == 子类和方法 m(Superclass), m(Subclass) 然后调用 m(Subclass)
- 可变参数:System.out.printf(String ,String...)
对自动装箱的支持也会很好。
如果无法解决调用,它可能会引发异常( ma(String,Object), ma(Object, String), args= String,String)
(如果您一直到这里,感谢您抽出宝贵时间阅读:- ))