【发布时间】:2011-01-14 14:57:13
【问题描述】:
作为开发小型 ScriptEngine 的一部分,我反思性地调用 java 方法。脚本引擎的调用为对象提供了方法名称和参数数组。为了调用该方法,我尝试通过调用 Class.getMethod(name, argument types) 来解决它。
但是,这仅在参数的类和 Method 期望的类相同时才有效。
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(超类), m(Subclass) 然后调用 m(Subclass)
- 变量参数: System.out.printf(String ,String...)
对自动装箱的支持也会很好。
如果调用无法解析,它可能会引发异常 (ma(String,Object), ma(Object, String), args= String,String)
(如果你做到了,感谢您抽出宝贵时间阅读:-))
【问题讨论】:
-
先为“最接近”定义严格的规则,然后是细节。
-
这也是我想知道的。但是对于所有迂腐正确的回答者来说,“定义最接近”,我有一个简单的答案:Java 通常会选择的答案(我猜是类加载)。
标签: java reflection dynamic-languages