李林超博客
首页
归档
留言
友链
动态
关于
归档
留言
友链
动态
关于
首页
Java
正文
JVM学习(十一)--自定义类加载器深入详解
Leefs
2019-12-03 AM
1435℃
0条
# 自定义类加载器深入详解 ### 前言 本篇将通过一个实例来对自定义类加载器进行深入详解 ### 代码 ```java public class MyTest16 extends ClassLoader{ private String classLoaderName; private final String fileExtension = ".class"; public MyTest16(String classLoaderName){ super();//将系统类加载器当做该类加载器的父加载器 this.classLoaderName = classLoaderName; } //作用:创建一个新的类加载器,会用指定的父类当作委托 public MyTest16(ClassLoader parent,String classLoaderName){ super(parent);//显式指定该类加载器的父加载器 this.classLoaderName = classLoaderName; } //将类的名字打印出来 @Override public String toString(){ return "["+this.classLoaderName+"]"; } //根据类的名称的字符串来去将类字节数组的数据给加载出来 //name:用户传进来想要加载的类的名称 private byte[] loadClassData(String name ){ InputStream inputStream = null; ByteArrayOutputStream baos = null; byte [] bytes = null; try{ this.classLoaderName = this.classLoaderName.replace(".","/"); baos = new ByteArrayOutputStream(); int ch = 0; while (-1 !=(ch = inputStream.read())){ baos.write(ch); } bytes = baos.toByteArray(); }catch (Exception e){ e.printStackTrace(); }finally { try{ inputStream.close(); baos.close(); }catch (Exception e){ e.printStackTrace(); } } return bytes; } //根据类的名称来寻找这个类,最后返回该类的对象 @Override protected Class> findClass(String className) throws ClassNotFoundException { byte [] data = loadClassData(className);//中间调用子类的findClass方法 return this.defineClass(className,data,0,data.length); } public static void test(ClassLoader classLoader) throws Exception{ Class> clazz = classLoader.loadClass("Jvm_Test.MyTest01"); Object object = clazz.newInstance(); System.out.println(object); } public static void main(String[] args) throws Exception { MyTest16 myTest16 = new MyTest16(MyTest16.class.getClassLoader(),"myClassLoader"); MyTest16.test(myTest16); } } ``` > 运行结果 ```java Jvm_Test.MyTest01@1b6d3586 ``` > 代码分析 1. 1.继承`ClassLoader`抽象类 + `ClassLoader`虽然是抽象类,但是内部没有抽象方法,JDK不想让我们直接去使用`ClassLoader`,希望我们以子类的形式去扩展它 2. 2.将类的名字或者类的扩展名以成员变量的形式给提供出来,方便使用 3. 3.定义一个以.class后缀结尾的常量 4. 4.构造方法:作用,用于创建一个新的类加载器 也是就是说我们所自定义的类加载器的父类就是系统类加载器 参数:`getSystemClassLoader()`作用:系统类加载器
标签:
Java
,
JVM
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
https://www.lilinchao.com/archives/250.html
上一篇
迭代器--ListIterator
下一篇
持有对象--LinkedList
取消回复
评论啦~
提交评论
栏目分类
随笔
2
Java
326
大数据
229
工具
31
其它
25
GO
47
标签云
Hive
Typora
国产数据库改造
Spark SQL
Livy
CentOS
Hbase
Jenkins
Spark Streaming
二叉树
散列
Hadoop
查找
Spark RDD
Tomcat
字符串
链表
Docker
ClickHouse
随笔
Golang基础
Nacos
JVM
MyBatis
SQL练习题
MyBatisX
Filter
gorm
Linux
持有对象
友情链接
申请
范明明
庄严博客
Mx
陶小桃Blog
虫洞