更新 - 使问题更清楚。

在通过反射调用方法时获取ClassCastException的可能原因是什么?

在尝试通过反射调用方法时,我将以下stacktrace作为我的应用程序的一部分。

java.lang.IllegalArgumentException: java.lang.ClassCastException@21fea1fv
    at sun.reflect.GeneratedMethodAccessor332.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at com..... 
    (remaining is my method stack trace)

我尝试了一个示例类,并将不同类型的各种参数传递给它,但我总是得到一个这个例外。

java.lang.IllegalArgumentException: argument type mismatch
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)

更新 -这是我为尝试重新创建异常而编写的示例代码

用于创建代理类的接口

package my.tests;

public interface ReflectionsInterface { 
    public abstract void doSomething();
}

这是测试类

package my.tests;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class Reflections implements ReflectionsInterface {

    public static void main(String[] args) {
        Reflections reflections = new Reflections();
        ReflectionsInterface reflectionsProxy = reflections.createProxy(ReflectionsInterface.class);
        invokeMethod(reflectionsProxy, "doSomething", null);
    }

    public <T> T createProxy(Class<T> entityInterface) {
        EntityInvocationHandler eih = new EntityInvocationHandler(this);
        T cast = entityInterface.cast(Proxy.newProxyInstance(
                entityInterface.getClassLoader(), new Class[]{entityInterface}, eih));
        return cast;
    }

    public static void invokeMethod(Object obj, String methodName, Object... args) {
        Method[] methods = obj.getClass().getMethods();
        try {
            for (Method method : methods) {
                if (method.getName().equals(methodName)) {
                    method.invoke(obj, args);
                    break;
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void doSomething() {
        System.out.println("woo");
    }

    private final static class EntityInvocationHandler implements InvocationHandler,
            ReflectionsInterface {

        private Reflections reflectionObj;

        public EntityInvocationHandler(Reflections reflectionObj) {
            super();
            this.reflectionObj = reflectionObj;
        }

        @Override
        public void doSomething() {
            reflectionObj.doSomething();
        }

        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            Object invoke = method.invoke(this, args);
            return invoke;
        }

    }
}

我无法理解何时会出现参数类型不匹配并导致ClassCastException 我无法重新创建异常,并想知道它为什么会出现。 任何重新创建它的工作代码,或在这种情况下抛出此异常的源代码引用都会很好

我已经浏览了Method.class javadocs和源代码,我无法弄清楚为什么会出现这个错误。

===============>>#1 票数:16 已采纳

我通过修改您的示例代码重新创建了ClassCastException :使用正确的参数调用invokeMethod 10000次,然后使用错误的错误调用它。

Reflections类中的main方法

public static void main(String[] args) {
    Reflections reflections = new Reflections();
    ReflectionsInterface reflectionsProxy = reflections
            .createProxy(ReflectionsInterface.class);
    for (int i = 0; i < 10000; i++)
        invokeMethod(reflectionsProxy, ReflectionsInterface.class,
                "doSomething");

    invokeMethod(new Object(), ReflectionsInterface.class, "doSomething");
}

Reflections类中的invokeMethod方法

public static void invokeMethod(Object obj, Class<?> clazz,
        String methodName, Object... args) {
    Method[] methods = clazz.getMethods();
    try {
        for (Method method : methods) {
            if (method.getName().equals(methodName)) {
                method.invoke(obj, args);
                break;
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

堆栈跟踪:

java.lang.IllegalArgumentException: java.lang.ClassCastException@603a3e21
    at sun.reflect.GeneratedMethodAccessor1.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at org.twbbs.pccprogram.Reflections.invokeMethod(Reflections.java:33)
    at org.twbbs.pccprogram.Reflections.main(Reflections.java:16)

我对ClassCastException解释:

当您第一次调用invokeMethod时,JVM使用较慢的路径,这对程序员来说更容易调试(因此它更慢!),因此当您传递错误的参数时,它将显示更友好的argument type mismatch消息。

当你多次调用invokeMethod (我的测试中有16次足够),JVM在运行时生成了一个GeneratedMethodAccessor*** ,它更快,错误检查更少。 因此,当您传递错误的参数时,它将显示如此丑陋的java.lang.ClassCastException@603a3e21消息。

===============>>#2 票数:1

这是问题所在:

reflections.invokeMethod("doInt", 1L);

你正在打电话给doInt ,但是你传递了long价值。 因此反射试图将Long转换为Integer ,这是无效的。

我怀疑你的意思是:

reflections.invokeMethod("doLong", 1L);

===============>>#3 票数:0

我有一点修改你的代码来重现这个错误:

java.lang.IllegalArgumentException: argument type mismatch

这是界面

public interface ReflectionsInterface
{
  public abstract void doSomething1(Integer i);
  public abstract void doSomething2(String s);
}

在类Reflection和EntityInvocationHandler中添加方法以进行编译。 然后在main()中添加此方法。 执行并生成错误运行时。

invokeMethod(reflectionsProxy, "doSomething1", "1");

我试图得到非ClassCastException,但我没有成功。 它可能出现在原始代码中,因为有更多对象,并且无效类型传递给方法。 添加日志并尝试调试以隔离ClassCastException。

  ask by Aditya translate from so

未解决问题?本站智能推荐:

1回复

尝试使用反射获取对字段的引用时发生IllegalArgumentException

我试图用相同的代码遍历许多自定义类的ArrayList,并认为使用反射将使其更容易。 但是,当我尝试获取每个字段的引用时遇到了一个问题。 这是我尝试运行的代码的一小部分。 (我的代码不同,但是要领在那儿): 到什么时候 我懂了 我怎样才能做到这一点?
2回复

Java将字段反射赋值为null,从而导致IllegaArgumentException

我有一个深度递归,反射方法,其目的是使有效负载中不应返回给调用者的任何值无效。 这组代码 被反复调用。 当它遇到特定字段时,我收到错误 日志语句中的一些输出显示它正在运行到那一点看起来像这样 我可以猜到的是,我以某种方式破坏了调用堆栈或内存模型,但我不知道如何解决问题
1回复

Field.set引发IllegalArgumentException

我试图在Java中为摆动对象做单向数据绑定,就像一个练习一样。 当前,对于扩展JTextComponent的swing对象,我添加了一个文档侦听器,该侦听器还更新了后备数据存储。 public class Binder { Map<JComponent, Map.Entry<W
1回复

参数类型不匹配:简单情况下为IllegalArgumentException

我有一个关于IllegalArgumentException的著名问题,我不知道为什么。 这是我的课: 在我的测试案例(尝试调用我的方法)中: 它始终位于IllegalArgumentException上。 Method对象听起来符合我的期望,例如: 任何想
1回复

Relfect构造函数的newInstance报告IllegalArgumentException异常

我尝试使用Reflect Constructor :: newInstance为动态生成的类生成实例。 错误和输出为: 我的代码是: 异常表明,构造函数的给定三个参数与构造函数的参数类型不匹配。 这对我来说很令人困惑,因为infor的debug(也就是输出中的println结
1回复

为什么通过Method.Invoke抛出IllegalArgumentException?

对于编程的实际任务,我们给出了一个示例.class文件。 我们需要打印出所有使用1 x int输入和一些可打印输出的方法,然后允许用户使用通过命令行指定的一个输入来运行该方法。 但是,当我尝试调用该方法时,将抛出IllegalArgumentException。 我的代码抛出异常:
2回复

尝试调用方法时发生IllegalArgumentException

我的代码如下: 为什么我什么时候尝试调用我的方法IllegalArgumentException ? 我想念什么? 更新:调用的函数是:
2回复

IllegalArgumentException:Java Constructor.newInstance()中的参数数量错误

考虑以下代码, 它出什么问题了? 我得到以下例外: 线程“main”中的异常java.lang.IllegalArgumentException:sun.reflect.DelegatingConstructorAccessorImpl上sun​​.reflect.Nativ
2回复

调用反射Class.getMethod时发生异常

我下面有代码调用使用反射的方法。 但我明白了 java.lang.IllegalArgumentException:参数数量错误 Method.invoke发生异常。 是什么原因?
2回复

Java反射。 访问字段的值

我正在尝试使用Java Reflection完成一个程序。 我对此部分有疑问。 我无法获得我想要的字段的值。 通过此代码,我得到以下消息: java.lang.IllegalArgumentException:无法将java.lang.String字段store.model