Java ClassLoader知识点

Java ClassLoader知识点:


0.双亲委托等知识,网络已经有详细解释,参考其他。

1.java class标识, 二进制的class定义(来源与jar包或其他方式)和对应的classLoader唯一标识该类
两个class比较的时候, 如isInstance, asInstance,任意一个不匹配将认为不等

2.通过new创建的对象,继承父对象的Class loader,在一个已经存在的对象,方法中通过setContextClassLoader修改classloader不会生效,new的对象仍然是默认的AppClassLoader
Thread.currentThread().setContextClassLoader(classLoader)可修改线程的ClassLoader
只有在修改之后,通过反射创建的对象,这个对象再创建的对象会是修改后的classloader

3.继承的对象load时,先load自身,再load父类
依然使用该class loader并且子类与类自身的classLoader可不同(通过自定义的classLoader,override loadClass方法中指定其他的classloader可以做到)
但是,子类与父类接口使用参数,返回值的class的class Loader,需要保持一致,否则运行时报错

附注:

自定义classloader实现参考,可以参考spark设计的HiveClientImpl(注意该classloader为IsolatedClientLoader.classLoader),HiveClient(classLoader为AppClassLoader),HiveShims,IsolatedClientLoader等源码

实现定义classloader,在同一个jvm中加载不同版本的hive client,以同时访问多个不通版本的hive。

 

参考博客:

Spark对HiveMetastore客户端的多版本管理、兼容性探究以及栅栏实现 https://blog.csdn.net/zhanyuanlin/article/details/95898018

slide:https://github.com/tianjiqx/slides/blob/master/Java%20ClassLoader.pdf

 

posted @ 2020-08-06 19:40  孤鸿寄语  阅读(181)  评论(0编辑  收藏  举报