背景
java.lang.ClassCastException: cn.com.nightfield.Plugin cannot be cast to cn.com.nightfield.Plugin
相同的class
,竟然不能cast?这是什么鬼?
问题描述
自定义类加载器(Classloader
)是很常见的,它可以让我们从自定义的文件系统目录,网络甚至是数据库的各种文件类型(jar
, war
, zip
等)中加载class
文件。
我们项目中使用了一个开源的类管理工具PF4J,来加载指定目录下的class
文件。但奇怪的是,当我们把class
加载进来之后,将它强转为目标类型,却报了java.lang.ClassCastException
,两者明明是同一个class
!
问题分析
先说明,错误是跟自定义类加载器有关。上一个小demo来模拟一下上述错误:
package cn.com.nightfield.jvm.classloader;
// 在class path下定义一个类
public class Plugin {
}
package cn.com.nightfield.jvm.classloader;
import java.net.URL;
import java.net.URLClassLoader;
// 自定义一个类加载器
public class CustomizedClassLoader extends URLClassLoader {
public CustomizedClassLoader(URL[] urls) {
super(urls);
}
protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
synchronized (getClassLoadingLock(name)) {