当前位置: 首页 > 知识库问答 >
问题:

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

赏梓
2023-03-14

我试图通过对通过其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;

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

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

共有1个答案

倪炎彬
2023-03-14

我已经找到了原因。我使用远程查找和反射的原因是我在另一个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中的所有泛型都将被删除,因此最终调用而不是。 我的问题是,即使我打电话是不是应该把它调用的方法,因为由于类型擦除,这种方法是有效的并且是类型的不是? 问题答案: 被调用的方法是在编译时定义的,而不是在运行时定义的。 如果在构造函数调用中添加参数,则

  • (注意:这只是一个测试代码,用来提出我的问题,而不是给出我实际场景的无关细节。)