前言
必须实现在工作中动态加载类对象信息的功能。 简单来说,class变成了Jvm,很快就可以知道并加载到内存中了。
类加载器分类
Ava类加载器有两种类型:启动类和其他类加载器。 Java加载类关系: Launcher
1 .启动类加载器(bootstrap类加载器)。
因为Java程序在Jvm上运行,所以Jvm需要知道Java程序的入口在哪里(启动类)。 Jvm通过c的加载主类加载Java程序的sun.launcher.LauncherHelper。 加载包含Mian函数的扩展类加载器和app类加载器。
2. Java自己创建的类加载器。
2.1 ext类加载器扩展类加载器
ExtClassLoader类没有父类。
stringvar0=system.getproperty (Java.ext.dirs );
上面的代码允许您设置类扩展类装载器装载Jar包的目录。
2.2在app class loader class _ path中指定的Jar包
app类加载器的父类是ext类加载器。 我们的主函数所在类的类加载器是app类加载器。
Java类加载器加载的Jar包路径
importsun.misc.Launcher; importjava.net.URL; publicclassclassloaderdemo1{ publicstaticvoidmain (string [ ] args ) }
string [ ] split=system.getproperty (' sun.boot.class.path ' ).split )、';' ); for(intI=0; i split.length; I ) {
system.out.println(split[I];
}
system.out.println ((=========================) );
URL [ ] URLs=launcher.getbootstrapclasspath ().getURLs ); for(intI=0; i urLs.length; I ) {
system.out.println(URLS[I];
}
}
}
执行结果:
委托机制
基于类加载器绘制Java委托和加载的原理图。
不会重新加载Java是由类的完全限定名称确定的
Java委托机制的好处。
1 .确保核心包加载不受干扰。
确保class加载是唯一的。
SPI机制
请先看看案例
publicinterfaceserverspi { voidexecmethod (;
}
两个实现类
publicclassserverspiimpl 1实施器sserverspi {
@Overridepublic voidexecMethod ()
system.out.println (serverspiimpl1. exec method执行);
}
}
和
publicclassserverspiimpl2implementsserverspi
@Overridepublic voidexecMethod ()
system.out.println (serverspiimpl2. exec method执行);
}
}
配置(目录匹配,文件名为接口名称) ) ) ) )。
文件的内容(类的完全限定名称) )。
写测试班
importsun.misc.Service; importjava.util.Iterator; publicclasspitest { publicstaticvoidmain { string [ ] args }
迭代器提供程序=service.providers (servers pi.class ); while(providers.Hasnext () ) )
ServerSPI ser=providers.next (;
ser.execMethod (;
}
}
}
执行结果:
serviceloaderload=service loader.load (SPI service.class ) -也可以使用此方法检索加载的对象。
在此情况下,没有使用Java委托机制来实现类的加载功能。
服务源代码重点:
私有身份验证前缀=' meta-INF/services/'; -为什么指定了目录?
publicstaticiteratorproviders (classvar0) throwsserviceconfigurationerror {
class loader var1=thread.current thread ().getContextClassLoader ); -获取线程所在的类类加载器。 返回提供程序(var1,var1);
}
SPI负载类原理:
1 .必须指定目录,程序必须在已知目录下找到接口信息,并根据接口找到实现类。
2 .用线程所在的ClassLoader加载实现,用反射实例化对象。
3 .其他精细源代码,有兴趣自己理解。
4 .我们常用的JDBC是使用SPI机制实现类加载。
自定义类加载器
实现热部署功能的情况: https://www.cn blogs.com/jssj/p/13251804.html
在案例中很好地利用了自定义类加载器,实现了如何打破Java委托机制。
总结
类加载器类型、类加载器各自的分工、类加载器委托流程、SPI机制和自定义加载器的实现。