java -Xbootclasspath/a: your_App
java -Xbootclasspath/p: your_App
指定扩展加载器的目录:
```java
java -Djava.ext.dirs=your_ext_dir HelloWorld
指定系统加载器的实现类:
java -Djava.system.class.loader=com.yourcorp.YourClassLoader HelloWorld
import java.util.Collection;
/**
public class PrintClassLoaderApp {
public static void main(String[] args) {
System.out.println("PrintClassLoaderApp 的类加载器是:"+PrintClassLoaderApp.class.getClassLoader());
System.out.println("parent 的类加载器是:"+ PrintClassLoaderApp.class.getClassLoader().getParent());
System.out.println("parent.parent 的类加载器是:"+ PrintClassLoaderApp.class.getClassLoader().getParent().getParent());
System.out.println("Collection 的类加载器是:"+ Collection.class.getClassLoader());
}
}
输出结果:
我使用的java10,PlatformClassLoader替代了ExtensionClassLoader;
```java
PrintClassLoaderApp 的类加载器是:jdk.internal.loader.ClassLoaders$AppClassLoader@4459eb14
parent 的类加载器是:jdk.internal.loader.ClassLoaders$PlatformClassLoader@2ac1fdc4
parent.parent 的类加载器是:null
Collection 的类加载器是:null
自定义类加载器一般用来进行进程内隔离,或者需要自己操纵字节码的场景。
过程如下:
1,通过名称找到二进制代码,即class文件;
2,使用class文件创建对应的class对象;
示例代码如下:
package org.example.mianshi.classloader;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
/**
* 作者: carter
* 创建日期: 2020/3/31 14:24
* 描述: 自定义类加载器
*/
public class CustomerClassLoaderApp extends ClassLoader {
@Override
protected Class findClass(String name) throws ClassNotFoundException {
byte[] bytes = loadClassFromFile(name);
return defineClass(name, bytes, 0, bytes.length);
}
private byte[] loadClassFromFile(String name) {
InputStream inputStream = getClass().getClassLoader()
.getResourceAsStream(name.replace(".", File.separator) + ".class");
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
int nextValue = 0;
try {
while ((nextValue = inputStream.read()) != -1) {
byteArrayOutputStream.write(nextValue);
}
} catch (IOException e) {
e.printStackTrace();
}
byte[] buffer = byteArrayOutputStream.toByteArray();
return buffer;
}
}
1, AOT , 即提前把字节码编译成机器码,然后在启动的时候指定机器码的位置,
2,AppCDS ,即提前把类信息加载成为元数据,使用内存映射技术,免除类加载和解析的开销。
本节回顾了jvm的类加载过程,类加载器的层次,双亲委派原则,
然后指明了自定义类加载器的使用场景和基本过程,以及给了一个简单的例子;
最后给出了两种加速类加载器速度的方法。
原创不易,转载请注明出处,让我们互通有无,共同进步,欢迎多沟通交流