首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Java自定义ClassLoader加载Class的问题

Java自定义ClassLoader加载Class的问题

前面两篇介绍了Java中的ClassLoader,如果对ClassLoader不熟悉的朋友可以参考以下文章。

Java中的ClassLoader机制

Java自定义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

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200515A004FR00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券