如何实现自定义类加载器,java自动加载类
写爬虫互联网协议(互联网协议)被封了怎么解决?立即使用
各类加载器虽然以父子相称,但是没有继承关系
(视频教程推荐:java课程)
点入类加载器的源码查看样例:
*区块配额在…之前
* class NetworkClassLoader扩展类别载入器{
*字符串主机;
* int端口;
*
*公共类findClass(字符串名称){
* byte[]b=加载类数据(名称);
*返回defineClass(name,b,0,b . length);
* }
*
*私有字节[]加载类数据(字符串名称){
* //从连接中加载类数据
* nbsp .nbsp .
* }
* }
*/前/后引号只需继承CalssLoader,重写查找类方法即可:
包装反映;
导入Java。io。文件;
导入Java。io。文件输入流;
导入Java。io。io异常;
导入Java。io。inputstream
导入Java。util。ArrayList
导入Java。util。列表;
公共类MyClassLoader扩展了类别载入器{
//用于保存加载的文件的大小
private int classSize
//新增的类加载路径
私有静态列表字符串路径=new ArrayList();
静态{
路径。添加( D:\ \ Users \ \ Jeff。更改\ \桌面\ \ );
}
//默认会将应用类加载器做为该类加载器的父加载器
公共MyClassLoader() {
}
公共我的类装入器(类装入器父级){
超级(父母);
}
@覆盖
受保护阶层?findClass(字符串名称)抛出ClassNotFoundException {
byte[] b=loadBinaryData(名称);
//打印执行标记
System.out.println(使用自定义类加载器.);
返回defineClass(name,b,0,classSize);
}
公共字节[] loadBinaryData(字符串名称)引发ClassNotFoundException{
字符串pathName=name.replaceAll(\\ . , /);
文件file=空
对于(字符串路径:路径){
文件=新文件(路径名)。类);
如果(文件。exists()文件。是file()){
打破;
}
}
if(file==null !file.isFile()){
抛出新的ClassNotFoundException();
}
//读取文件的二进制信息
try(InputStream in=new file InputStream(file)){
//一般这个大小够了,这里是为了方便读取
//文件的内容,所以一次性读入,并且将大小返回
//用于定义类
字节[] b=新字节[1024 * 1024 * 10];
班级规模=英寸。改为(b);
返回b;
} catch(io异常io异常){
;
}
返回空
}
}这里加入了一个MyClassLoader自定义类加载器,扫描的路径为:
d:\ \用户\ \杰夫。更改\ \桌面\ \那么新加入的类加载器就和应用类加载器,扩展类加载器,启动类加载器一起起作用。
测试用例:
包装反映;
公共类人员{
私有字符串名称;
私弦年龄;
公共人物(){
}
公共人物(字符串名称,字符串年龄){
this.name=name
this.age=年龄;
}
公共字符串getName() {
返回名称;
}
公共void集合名称(字符串名){
this.name=name
}
公共字符串getAge() {
回归年龄;
}
公共空存储(字符串年龄){
this.age=年龄;
}
@覆盖
公共字符串toString() {
返回"人员{"
name= name \
,age= age \
};
}
}客户端:
包装反映;
公共类客户端{
公共静态void main(String[] args)引发异常{
我的类加载器class loader=new my class loader();
班级?class=class loader。加载类( reflect .人);
系统。出去。println(一个类);
系统。出去。println(一个类。get class loader());
}
}时直接运行代码:那么会输出
阶级反映。人
sun . misc . launcher $ app class loader @ 18 B4 AAC 2
我发现我的类加载器根本不能工作。其实是因为父母的委托机制:
1.MyClassLoader检查它是否已经被加载-"2。App class loader检查是否已加载-"3。扩展类加载器以检查它是否已经被加载。
-4,启动类加载器看是否已经加载,如果没有就尝试加载-5,尝试加载扩展类-6,尝试加载app类-7,尝试加载MyClassLoader-8,抛出找不到类的异常。
在上面的过程中,step 6会找到对应的类,所以直接返回。MyClassLoader根本没有机会加载它,所以自定义类加载器MyClassLoader没有被调用。
如果要加载它,将编译后的Person.class移动到桌面reflect/Person.class并执行结果:
使用自定义类加载器.
阶级反映。人
反思。MyClassLoader@135fbaa4
结果,定制类加载工作了,这实际上是上述过程中的第七步。相应类的二进制文件被找到并加载到。
推荐:java入门。以上是java实现自定义类加载器的细节。更多请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。