我用这种方法直接写一个普通类直接运行,调用完全正常。但放在JSP中调用总是出现NoSuchMethodException.
代码如下:
EJBClient cxObj = EJBClient.getInstance();
String resultStr = cxObj.call("KYDJ", "Cx", new String[] {tj, "KYDJ", "0", "19"});

public String call(String jndiName, String methodName, Object[] args) {
String returnValue = null;
Class[] argTypes = null;
Object proxy = createProxy(jndiName);
if (args != null) {
argTypes = new Class[args.length];
for (int i = 0; i < args.length; i++) {
argTypes = args.getClass();
}
try {
returnValue = (String) (proxy.getClass().getDeclaredMethod(methodName,
argTypes).invoke(proxy, args));//此处在JSP中出错
}
catch (java.lang.NoSuchMethodException nsme) {
....
虚心求教.

关于保持远程调用接口的一致性问题, 早在几年前就有过用refection和code generator的争论, 结果可以参考一下corba和SOA的标准做法, 用代码生成工具来做. 原因就是code generator有compiling check的好处, 这对于大项目, 由其对采用了daily build的term来说更为突出

前面我说解决了,其实只是换了一个方式把问题处理了,并没有理想的方案。我的办法:考虑Primitive Type毕竟有限,做一个静态方法进行转换。
if(arg instanceof Integer) return Integer.TYPE;
else return obj.getClass();
显然,这种方法很笨拙,希望有朋友给出更好的solution.

现在有一个问题啊,在invoke方法时,如果被调函数抛出异常,则invoke会抛出InvocationTargetException,这个异常不包含message信息,上一级的调用者即使捕获了InvocationTargetException也无法知道异常是什么了!

诸位是如何解决的?!banq有何高见?

是的,目前我这里也没有捕捉到细节,只是通过Logger定位上位错误。需要进一步研究。