(JavaSE 学习记录) 自定义类加载器
自定义类加载器
1、继承 java.lang.ClassLoader
2、检查加载的类是否已经被装载,若已经装载,直接返回
3、委派类加载请求给父类加载器,若父类能完成,返回父类加载器加载的Class实例
4、调用本类加载器findClass方法,试图获取对应字节码,若成功则调用defineClass导入类型到方法区,失败则返回异常。
import java.io.*;//继承 java.lang.ClassLoader
public class FileSystemClassLoader extends ClassLoader {private String rootDir;public FileSystemClassLoader(String rootDir){this.rootDir = rootDir;}//findClass方法@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException {Class<?> c = findLoadedClass(name);//是否已被加载if (c!=null){return c;}else {//双亲委托ClassLoader parent = this.getParent();//避免在此停止try {c = parent.loadClass(name);}catch (Exception e){}if (c!=null){return c;}else {//获取对应字节数组byte[] classData = getClassData(name);if (classData == null){throw new ClassNotFoundException();}else{//利用defineClass导入类型到方法区c=defineClass(name,classData,0,classData.length);}}}return c;}//获取字节数组对应方法private byte[] getClassData(String name){String path = rootDir+"/"+name.replace('.','/')+".class";InputStream is = null;ByteArrayOutputStream baos = new ByteArrayOutputStream();try {is = new FileInputStream(path);byte[] flush = new byte[1024];int len ;while((len = is.read(flush))!=-1){baos.write(flush,0,len);}return baos.toByteArray();} catch (IOException e) {e.printStackTrace();return null;}finally {try {if (is!=null) {is.close();}} catch (IOException e) {e.printStackTrace();}}}
}
测试:同一个类被不同加载器加载,jvm认为是不同的
public static void main(String[] args) throws ClassNotFoundException {FileSystemClassLoader loader = new FileSystemClassLoader("D:/JavaNote");FileSystemClassLoader loader02 = new FileSystemClassLoader("D:/JavaNote");Class<?> c = loader.loadClass("Test");Class<?> c2 = loader.loadClass("Test");Class<?> c3 = loader02.loadClass("Test");Class<?> c4 = loader.loadClass("java.lang.String");Class<?> c5 = loader.loadClass("Re.Test");System.out.println(c.hashCode());System.out.println(c2.hashCode()); //与c相同System.out.println(c3.hashCode()); //与c、c2相同,同一个类被不同加载器加载,jvm认为是不同的System.out.println(c4.hashCode());System.out.println(c5.getClassLoader()); //系统默认加载器System.out.println(c3.getClassLoader()); //自定义加载器System.out.println(c4.getClassLoader()); //null 引导类加载器}
(JavaSE 学习记录) 自定义类加载器相关推荐
- Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论
Java虚拟机JVM学习06 自定义类加载器 父委托机制和命名空间的再讨论 创建用户自定义的类加载器 要创建用户自定义的类加载器,只需要扩展java.lang.ClassLoader类,然后覆盖它的f ...
- Android进阶:十三、自定义类加载器加载加密类文件
之前面试的时候有许多面试官问类加载器相关的问题,所以这是一个很重要的知识点.而且对于高级Android研发来讲,懂得更多类加载相关的东西,对开发也会有很多的帮助,比如热更新,类加密等. 其实笔者对类加 ...
- 自定义类加载器在复杂类加载情况下的运行分析
在之前咱们都在研究自定义类加载器的一些东东,不过接一来的学习还会依托于之前咱们写的MyTest16这个自定义类加载器,这里先再回顾一下: public class MyTest16 extends C ...
- 自定义类加载器_jvm超详细探索自定义类加载器(值得收藏)
原创:鲁班学院子牙老师 微信公众号搜索启明南 如果你想看懂本篇文章,需要你对类加载器有一定的了解.如JVM自带的类加载器.双亲委派.自定义类加载器.类加载每个阶段做了什么--如果你对这些知识还有夹生的 ...
- 请你详细说说类加载流程,类加载机制及自定义类加载器
一.引言 当程序使用某个类时,如果该类还未被加载到内存中,则JVM会通过加载.链接.初始化三个步骤对该类进行类加载. 二.类的加载.链接.初始化 1.加载 类加载指的是将类的class文件读入内存,并 ...
- JVM——自定义类加载器
0. 为什么需要自定义类加载器 网上的大部分自定义类加载器文章,几乎都是贴一段实现代码,然后分析一两句自定义ClassLoader的原理.但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚,因 ...
- JVM类加载机制、双亲委派机制、自定义类加载器、打破双亲委派机制
1.类加载器 站在Java虚拟机的角度看,只有两种不同的类加载器:一种是启动类加载器(Bootstrap ClassLoader),这个类加载器使用C++语言实现(HotSpot虚拟机.JDK8中), ...
- 面试干货4——你对Java类加载器(自定义类加载器)有了解吗?
类加载器 推荐:在准备面试的同学可以看看这个系列 一.类加载器的作用 二.Java虚拟机类加载器结构 1. 引导类(启动类)加载器 2. 扩展类加载器 3. 系统类加载器 三.类加载器的加载机制 1. ...
- java 扩展类加载器_java实现自定义类加载器
各类加载器虽然以父子相称,但是没有继承关系 (视频教程推荐:java课程) 点入ClassLoader的源码查看样例:* * class NetworkClassLoader extends Clas ...
最新文章
- 使用windows.name解决js跨域数据通信
- lnmp环境搭建 wordpress 博客系统
- 面向.NET开发人员的Dapr——机密
- 【OpenCV】图像金字塔详解及编程实现
- linux 系列:[所有相关文章链接]
- CentOS7安装JDK完整步骤
- 中级通信工程师证书会过期吗
- 重置计算机网络设置路由器,重新设置路由器的步骤
- Java实现八皇后问题
- linux 检查zip是否损坏,用-v参数 unzip -v test.zip 检查zip文件是否损坏代常亮
- 搭建java环境和java学习
- java8判断当前时间是否大于某个时间
- Python实用功能之pdf文件转png图片数据
- 如何提高场馆的二次成交率?
- 信息发布类网站后台界面设计一点思考(整体布局)
- 12.1.2、Doris__基本使用、doris的基本命令、建表概念、语句、建表语法、建表方式(引擎存储规则)、导入数据的方式、支持的数据类型、rollup索引
- 使用Numpy创建数组_总结
- FilterConfig的用法是什么?
- OSChina 周四乱弹 —— 你妈是洗衣机的亲妈
- 常见的自然法则及管理启示