Java 当我实例化一个类并将其转换到该类正在实现的接口时,为什么会得到ClassCastException?

Java 当我实例化一个类并将其转换到该类正在实现的接口时,为什么会得到ClassCastException?,java,Java,我不熟悉这个类加载器概念。我为此浪费了将近一周的时间,但我找不到任何解决办法 URLClassLoader jarLoader = new URLClassLoader (urlList); Class clazz = jarLoader.loadClass(classname); Object instance=clazz.newInstance(); (Interface1)(instance); 在第4行,我得到了ClassCastException 请帮我解决这个问题?如果有任何反馈,

我不熟悉这个类加载器概念。我为此浪费了将近一周的时间,但我找不到任何解决办法

URLClassLoader jarLoader = new URLClassLoader (urlList);
Class clazz = jarLoader.loadClass(classname);
Object instance=clazz.newInstance();
(Interface1)(instance);
在第4行,我得到了ClassCastException

请帮我解决这个问题?如果有任何反馈,我将不胜感激。

这听起来像Interface1是由两个不同的类加载器加载的。您正在将其转换为Interface1 A,但您的jarLoader希望它是Interface1 B

您确定urlList不包含以前加载的类的URL吗?还是Interface1的不同版本

这将帮助您找到错误,请使用此而不是Interface1instance;:

这听起来像Interface1是由两个不同的类装入器装入的。您正在将其转换为Interface1 A,但您的jarLoader希望它是Interface1 B

您确定urlList不包含以前加载的类的URL吗?还是Interface1的不同版本

这将帮助您找到错误,请使用此而不是Interface1instance;:


然后使用将另一个类加载器作为参数的构造函数-传递与接口关联的类加载器

URLClassLoader = new URLClassLoader(urlList,Interface1.class.getClassLoader())

您案例中的问题是,该类正在实现由URLClassLoader加载的接口,当您尝试将其强制转换到由其他类加载器加载的接口时。

然后使用以另一个类加载器为参数的构造函数-传递与该接口关联的类加载器

URLClassLoader = new URLClassLoader(urlList,Interface1.class.getClassLoader())


您案例中的问题是,该类正在实现由URLClassLoader加载的接口,而您正试图将其转换为由其他类加载器加载的接口。

这可能是因为Interface1已由其他类加载器加载。

这可能是因为Interface1已由不同的类加载器。

Interface1可能是由与您的类不同的类加载器加载的。当由不同的类加载器加载时,类被认为是不同的

Interface1可能是由与您的类不同的类加载器加载的。当由不同的类加载器加载时,类被认为是不同的

您可以在此处发布实际异常吗?在强制转换之前,您可以使用iInstance is Interface check检查此实例是否确实属于您正在强制转换的类型。您可以在此处发布实际异常吗?在强制转换之前,您可以使用iInstance is Interface check检查此实例是否确实属于您正在强制转换的类型转换为HI,也许您应该尝试以下操作:调试以下语句:Interface1.class.getClassLoader,然后是instance.getClass.getClassLoader-如果您看到ClassLoader完全不同-您的问题将通过DBTW得到解决。我假设Interface1的实例instanceof已解析为eb true,否则ClassCastException很简单:您好,也许您应该尝试以下操作:调试以下语句:Interface1.class.getClassLoader,然后是instance.getClass.getClassLoader-如果您看到ClassLoader完全不同-您的问题将通过DBTW解决。我假设Interface1的实例instanceof被解析为eb true,否则ClassCastException就无关紧要了:在我的场景中,我有一个URL列表,在这个列表中,我加载了两个不同的jar。一个jar包含实现类,另一个jar包含该接口。那么这就是问题吗?如果使用上述代码,接口将是从同一个类加载器加载-在其中执行这段代码。URL列表中提供的jar中的接口被忽略-您甚至可以排除它。这是因为类加载器将在尝试加载之前委托给父级。URLClassLoader在需要接口时,会将请求委托给作为参数传递的父类加载器。这将确保只有一个版本的接口存在。试一下代码,如果不起作用,请告诉我。在我的场景中,我有一个URL列表,在这个列表中,我加载了两个不同的jar。一个jar包含实现类,另一个jar包含该接口。这就是问题所在吗?如果您使用上述代码,接口将从同一个类加载器加载—您所在的类加载器执行这段代码。URL列表中提供的jar中的接口被忽略-您甚至可以排除它。这是因为类加载器将在尝试加载之前委托给父级。URLClassLoader在需要接口时,会将请求委托给作为参数传递的父类加载器。这将确保只有一个版本的接口存在。试一下代码,如果它不起作用,请告诉我。在我的场景中,我有一个URL列表,在这个列表中,我加载了两个不同的jar。一个jar包含实现类,另一个jar包含该接口。这就是它们。嘿,我试着使用代码。但我也在这里
我遇到了类强制转换异常。现在该怎么办?:@mum whoa,你似乎真的把你的类加载器搞砸了:-在我的场景中,我有一个URL列表,在这个列表中,我加载了两个不同的jar。一个jar包含实现类,另一个jar包含该接口。这是他们吗,我试图使用代码。但这里我也遇到了类强制转换异常。现在该怎么办?:@妈妈,哇,你似乎真的把你的类加载器搞砸了:-但我正在将它添加到同一个类加载器中,但我正在将它添加到同一个类加载器中