我正在使用一个调用Java库的小型Groovy脚本。 Java库有一个方法m(String,int)
,其中第二个参数是int基本类型。
下面的脚本创建一个新的int变量并尝试调用该方法。
int year = 2013
def obj = dao.m("johndoe", year)
但是失败了,因为第二个参数的类型是java.lang.Integer
包装器,而不是原始int:
groovy.lang.MissingMethodException: No signature of method: com.sun.proxy.$Proxy11.m() is applicable for argument types: (java.lang.String, java.lang.Integer) values: [IN-94158-11, 2013]
如何声明变量来保存原始int,以便我可以调用方法m()?
其他一些人被这个问题所困扰。从email in Groovy Users:
开始As we stated earlier, it doesn’t matter whether you declare or cast a variable to be
of type int or Integer. Groovy uses the reference type (Integer) either way.
答案 0 :(得分:0)
无法在Grovy 2.1.3,JDK 7上重现以下内容:
// file EjbImpl.java
import java.lang.reflect.*;
public class EjbImpl {
private EjbImpl() {}
public Ejb newInstance() {
return (Ejb) Proxy.newProxyInstance(
EjbImpl.class.getClassLoader(),
new Class[] { Ejb.class },
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) {
System.out.println("invoke " + method);
return args.toString();
}
}
);
}
public void process(int i) {
System.out.println("ejb.process = " + i);
}
}
// Ejb.java
public interface Ejb {
public void process(int i);
}
// EjbTest.groovy
ejb = EjbImpl.newInstance()
ejb.process new Integer(90)
我必须承认,我不确定这是否是EJB创建代理的方式......
您是否尝试过year.intValue()
?
答案 1 :(得分:0)
解决。
问题是,JNDI查找的结果还不是远程对象,而是将实例化远程对象的代理的EJBHome对象。
因此,调用方法查找的结果没有方法m()。相反,它有方法remove()
,create()
,getEJBObject()
,getEJBMetadata()
和其他方法。
因此,我的脚本变为:
// def dao = ctx.lookup("MyDao") // WRONG ! Result of JNDI lookup returns an EJBHome,
// not a proxy to the remote object
def dao = ctx.lookup("MyDao").create() // OK. This is a proxy to the remote object.
dao.m("johndoe", 2013) // OK. Groovy DOES call the correct method,
// which takes an int.
我应该先检查一下对象及其方法的类:
dao.class
dao.class.methods