无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配

时间:2019-08-20 12:35:12

标签: java reflection

我试图通过对通过JNDI参考查找的EJB进行反射来调用方法。它需要三个参数:EndUser对象(自定义对象),Set(自定义类)和布尔值。 第一个对象导致调用失败,并带有“无法调用方法:java.lang.IllegalArgumentException:参数类型不匹配”。 只要第一个参数为非空,就会发生这种情况。将其设置为null可以消除错误。

实际通话:

  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;

不会引发任何异常并调用该方法,这应表明参数的正确类型。

在调试时,我可以看到找到了正确的方法,并且所需的参数类型与我提供的参数类型相同。 是否有关于如何找出实际问题的想法?

Break point showing the required and provided method arguments

1 个答案:

答案 0 :(得分:0)

我能够找到原因。我使用远程查找和反射的原因是我在另一个EAR中调用EJB。结果, EndUser 类是由另一个类加载器创建的,因此未被识别为必需类的实例。 有关更多信息,请参见ClassCastException when casting to the same class