赞
踩
java -Xbootclasspath/a:<your_dir> your_App
java -Xbootclasspath/p:<your_dir> your_App
-
- <br />
- <br />指定扩展加载器的目录:
- ```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());
-
- }
}
-
- <br />输出结果:<br />我使用的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的类加载过程,类加载器的层次,双亲委派原则,
然后指明了自定义类加载器的使用场景和基本过程,以及给了一个简单的例子;
最后给出了两种加速类加载器速度的方法。
原创不易,转载请注明出处。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。