我试图通过对通过其JNDI引用查找的EJB的反射来调用一个方法。它需要三个参数:EndUser对象(自定义对象)、Set(自定义类)和布尔值。第一个对象使用“无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配”导致调用失败。只要第一个参数非空,就会发生这种情况。将其设置为空会使错误消失。
实际通话:
public Relation createRelation(final Relation relation, final HashSet<Contact> contacts) {
final EndUser user = new EndUser();
Object[] args = new Object[]{user, contacts, false};
try {
return (Relation) EjbUtils.invoke("registerEndUser", REGISTRATION_SERVICE_JNDI, args);
} catch (final Throwable throwable) {
LOGGER.error("Could not invoke method", throwable);
return null;
}
}
EjbUtils方法:
public static Object invoke(final String methodName, final String ejbName, final Object... args) throws Throwable {
final String jndiName = getEjbJndi(ejbName);
final Object remoteObject = lookup(jndiName);
final Method[] methods = remoteObject.getClass().getMethods();
for (final Method method : methods) {
if (methodName.equals(method.getName()) && args.length == method.getParameterCount()) {
try {
return method.invoke(remoteObject, args);
} catch (IllegalAccessException e) {
final String message = String.format("Could not invoke method %s on %s: %s", methodName, ejbName, e.getMessage());
LOGGER.error(message);
throw new IllegalStateException(message, e);
} catch (InvocationTargetException e) {
throw e.getCause();
}
}
}
throw new IllegalArgumentException("Method not found");
}
我尝试调用的方法:
public Relation registerEndUser(final EndUser relation, final Set<Contact> contacts, boolean sendMail)
throws RegistrationServiceException, RegistrationServiceWarning {
return registerRelation(relation, contacts, sendMail);
}
奇怪的是:如果我
final EndUser user = new EndUser();
具有
final EndUser user = null;
不会引发异常并调用该方法,这应该表明参数的类型正确。
调试时,我可以看到找到了正确的方法,并且所需的参数类型与我提供的参数类型相同。有没有想过如何找出实际问题是什么?
我已经找到了原因。我使用远程查找和反射的原因是我在另一个EAR中调用EJB。因此,最终用户类是由不同的类加载器创建的,因此无法识别为所需类的实例。有关更多信息,请参阅ClassCastException转换到同一类时。
我正在编写一个学习反射的示例应用程序。我试图使用反射从另一个类调用一个类中定义的主方法,但我得到了 线程“main”java中出现异常。lang.IllegalArgumentException:参数类型不匹配 在下面查找我正在尝试执行的代码。 调用main方法的类 要调用其主方法的类
我有这样一个班级: 我想将数组迭代分解为一个单独的方法,以便在整个程序中重复使用或重新调用它,如下所示: 然后我想在我的公共方法中调用它,例如: 我在这里尝试了解决方案:无法通过添加但它仍然不工作。我有所有可用变量的setter和getter。我相信有一个简单的解决办法,但请让我知道,如果有办法绕过它。 谢谢你
我刚开始使用Mockito,我正在验证某个方法应该用特定的参数调用,而所有的值类型参数(int、String、enum等)都可以验证,但引用/类类型参数似乎没有,下面是一个示例 那么,我如何将引用对象传递到我的输入方法中,并在这里将其模拟为我的内部方法的返回值呢?顺便说一句,如果我的方法只包含值类型参数,它将工作...
我不断得到这样的错误: 错误:找不到适合计划的方法(足球,int) 方法Timer.Schedule(TimerTask,long)不适用 (参数不匹配;soccer无法转换为TimerTask) 方法timer.schedule(TimerTask,Date)不适用 (参数不匹配;soccer无法转换为TimerTask) 对不起可怜的岗位,第一次做这件事。
问题内容: 我是从Joshua Bloch的google I / O困惑者演讲中得到的。这是代码 这个main方法会引发异常,因为它是原始类型,因此in中的所有泛型都将被删除,因此最终调用而不是。 我的问题是,即使我打电话是不是应该把它调用的方法,因为由于类型擦除,这种方法是有效的并且是类型的不是? 问题答案: 被调用的方法是在编译时定义的,而不是在运行时定义的。 如果在构造函数调用中添加参数,则
(注意:这只是一个测试代码,用来提出我的问题,而不是给出我实际场景的无关细节。)