文章目录
Java类加载器(Java Classloader)负责动态地将Java类加载到Java虚拟机的内存空间内,Java提供了3种类加载器,每个类加载器负责加载特定位置的Java类。
启动类加载器(Bootstrap ClassLoader)
- 该类加载器由C++语言实现,负责加System.getProperty(“sun.boot.class.path”)所指定核心Java库,也可以通过java -Xbootclasspath指定其加载路径
可以把加载路径给打印出来
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println(System.getProperty("sun.boot.class.path"));
}
}
D:\develop\jre\lib\resources.jar;
D:\develop\jre\lib\rt.jar;
D:\develop\jre\lib\sunrsasign.jar;
D:\develop\jre\lib\jsse.jar;
D:\develop\jre\lib\jce.jar;
D:\develop\jre\lib\charsets.jar;
D:\develop\jre\lib\jfr.jar;
D:\develop\jre\classes
扩展类加载器(Extension ClassLoader)
- 该类加载器由sun.misc.Launcher$ExtClassLoader类实现(sun.misc.Launcher的内部类),负责加载System.getProperty(“java.ext.dirs”)所指定的Java的扩展库,也可以通过java -Djava.ext.dirs指定其加载路径.
- 如果把自己的开发的jar包放在指定路径下,也会被加载。
创建一个学生类
导出jar并把jar拷贝到 jre文件夹\lib\ext 文件夹中
测试类
public class ClassLoaderTest {
public static void main(String[] args) {
System.out.println(System.getProperty("java.ext.dirs"));
System.out.println(Student.class.getClassLoader().getClass().getName());
}
}
未把导出的jar包拷贝到 jre\lib\ext目录中的结果
D:\develop\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.misc.Launcher$AppClassLoader
jar包拷贝之后的结果
D:\develop\jre\lib\ext;C:\Windows\Sun\Java\lib\ext
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$ExtClassLoader类源码
static class ExtClassLoader extends URLClassLoader {
static {
ClassLoader.registerAsParallelCapable();
}
/**
* create an ExtClassLoader. The ExtClassLoader is created
* within a context that limits which files it can read
*/
public static ExtClassLoader getExtClassLoader() throws IOException
{
final File[] dirs = getExtDirs();
try {
// Prior implementations of this doPrivileged() block supplied
// aa synthesized ACC via a call to the private method
// ExtClassLoader.getContext().
return AccessController.doPrivileged(
new PrivilegedExceptionAction<ExtClassLoader>() {
public ExtClassLoader run() throws IOException {
int len = dirs.length;
for (int i = 0; i < len; i++) {
MetaIndex.registerDirectory(dirs[i]);
}
return new ExtClassLoader(dirs);
}
});
} catch (java.security.PrivilegedActionException e) {
throw (IOException) e.getException();
}
}
void addExtURL(URL url) {
super.addURL(url);
}
/*
* Creates a new ExtClassLoader for the specified directories.
*/
public ExtClassLoader(File[] dirs) throws IOException {
super(getExtURLs(dirs), null, factory);
SharedSecrets.getJavaNetAccess().
getURLClassPath(this).initLookupCache(this);
}
private static File[] getExtDirs() {
String s = System.getProperty("java.ext.dirs");
File[] dirs;
if (s != null) {
StringTokenizer st =
new StringTokenizer(s, File.pathSeparator);
int count = st.countTokens();
dirs = new File[count];
for (int i = 0; i < count; i++) {
dirs[i