类加载器的分类
分类
无论类加载器的类型如何划分,在程序中我们最常见的类加载器始终只有三个,如下所示:

- 
启动类加载器- 负责加载JAVA_HOME/lib目录下的可以被虚拟机识别(通过文件名称,比如rt.jar``tools.jar)的字节码文件。
- 与之对应的是java.lang.ClassLoader类
 
- 负责加载
- 
扩展类加载器- 负责加载JAVA_HOME/lib/ext目录下的的字节码文件。
- 对应sun.misc.Launcher类 此类继承于启动类加载器ClassLoader
 
- 负责加载
- 
应用程序类加载器- 负责加载ClassPath路径下的字节码 也就是用户自己写的类。
- 对应于sun.misc.Launcher.AppClassLoader类 此类继承于扩展类加载器Launcher
 
- 负责加载
- 
用户自定义加载器- 需要继承系统类加载器ClassLoader,并重写findClass方法。
- 负责加载指定位置的字节码文件。通过类中的path变量指定。
- 如下为用户重写的自定义加载器
package cn.shaoxiongdu; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; /** * @作者: 写Bug的小杜 【email@shaoxiongdu.cn】 * @时间: 2021/07/30 * @描述: 用户自定义类加载器 */ public class MyClassLoader extends ClassLoader { private String path="/home/lib/"; //默认加载路径 private String name; //类加载器名称 private final String filetype=".class"; //文件类型 public MyClassLoader(String name) { // TODO Auto-generated constructor stub super(); this.name=name; } public MyClassLoader(ClassLoader parent,String name){ super(parent); this.name=name; } @Override public Class<?> findClass(String name) throws ClassNotFoundException { // TODO Auto-generated method stub byte[] b=loadClassData(name); return defineClass(name, b, 0, b.length); } private byte[] loadClassData(String name) { byte[] data=null; InputStream in=null; name=name.replace('.', '/'); ByteArrayOutputStream out=new ByteArrayOutputStream(); try { in=new FileInputStream(new File(path+name+filetype)); int len=0; while(-1!=(len=in.read())){ out.write(len); } data=out.toByteArray(); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { in.close(); out.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return data; } public String getPath() { return path; } public void setPath(String path) { this.path = path; } @Override public String toString() { // TODO Auto-generated method stub return this.name; } }
 
- 需要继承系统类加载器
感谢您的来访,获取更多精彩文章请收藏本站。
 
                      © 版权声明
THE END
    



















暂无评论内容