Java自定义ClassLoader加载Class的问题
前面两篇介绍了Java中的ClassLoader,如果对ClassLoader不熟悉的朋友可以参考以下文章。
在自定义ClassLoader的时候,我们不能把加载进来的class直接转成对应的对象,因为这两是不同classLoader加载进来的,下面是测试的代码,T2是一个自定义的类,里面有个getMsg的方法,getMsg方法返回一个固定的字符串。用自定义ClassLoader(上文有源码)加载的class的实例直接强制转成T2,我们运行下面的代码,可以看看结果。
测试1代码
上面的代码执行结果如下:
Exception in thread "main" java.lang.ClassCastException: test.T2 cannot be cast to test.T2
at test.Test1.main(Test1.java:13)
可见发生了ClassCastException异常,原因就是T2是AppClassLoader加载的,aClass1是用我们自定义的ClassLoader加载的,所有不能直接转换。如果想要调用T2的getMsg方法,我们可以用反射方式。下面的就是用反射实现的代码。
Method method = aClass1.getDeclaredMethod("getMsg"); method.invoke(aClass1.newInstance(),new Object[]{});
如果我们想直接转成T2呢?
就需要把T2的加载也是我们自定义的ClassLoader来加载,我们可以创建一个类,这个类用自定义ClassLoader加载,里面的T2也会用我们的ClassLoader加载,这样就可以强制转换,源码如下:
Test2测试类
我们写个Main方法来加载Test2,步骤如下
初始化自定义ClassLoader
用自定义ClassLoader来加载Test2
用放射机制来调用Test2的test方法
测试启动类
测试正常结束,并且打印出的结果看T2是我们自定义的ClassLoader加载的,这样强制转换就不会发生异常。
测试结果
最后附上T2的定义
T2
领取专属 10元无门槛券
私享最新 技术干货