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

Java自定义ClassLoader实现

Java自定义ClassLoader实现

上文说Java中的ClassLoader机制,在文章末尾说要自定义一个类加载器,现在就来实现下。

实现自定义ClassLoader

前文说过如果通过classLoader的loadClass方法来加载类,需要实现findClass方法,在这个方法中自定义获取文件的字节数组,再调用defineClass方法实现类的加载。

说明:如果不通过loadClass来加载类,可以不重写findClass方法。

以下是自定义类加载器的步骤:

继承ClassLoader抽象类,也可以继承其他类比如URLClassLoader,AppClassLoader和ExtClassLoader都继承于URLClassLoader。

创建构造方法,并且构造方法中调用父类的构造方法,如果要加载的类在当前的classpath下,应该传入空的parent,避免AppClassLoader加载此类。

重写findClass方法,在这个方法中需要调用父类的defineClass方法,这个方法需要传入类文件的字节数组。

定义一个读取类文件的方法,传入类的全名,方法字节数组。

以下就是完整的自定义classloader,可以参考下。

自定义classloader

定义好了ClassLoader,我们就使用自定义的classloader来加载个类,我们用loadClass方法,最后输出classLoader对象,来验证是否是我们所定义的。

自定义classloader

如果在上面的代码中添加一句T2 t2 = (T2) aClass1.newInstance(),在运行中会报类转换错误,因为T2是AppClassLoader加载的,后面的aClass1是自定义类加载器加载的,肯定不能转换,如果想要调用T2中的方法,可以用反射方式。

后文再分享Tomcat的类加载时怎么隔离不同应用的,谢谢!

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券