写一个自定义类加载器demo
public class MyTest16 extends ClassLoader {
private String classLoaderName;
private String fileExtension = ".class";
private String path;
public MyTest16(String classLoaderName) {
super(); // 将系统类加载器当做该类加载器的父类加载器
this.classLoaderName = classLoaderName;
}
public void setPath(String path){
this.path = path;
}
public MyTest16(ClassLoader parent, String classLoaderName) {
super(parent); //显示指定该类的加载器的父类加载器
this.classLoaderName = classLoaderName;
}
private byte[] loadClassData(String className) {
InputStream is = null;
byte[] data = null;
ByteArrayOutputStream baos = null;
String classNameResult = className.replace(".", "\\");
System.out.println(classNameResult);
try {
//注意win和linux
this.classLoaderName = this.classLoaderName.replace(".", "\\");
//指定磁盘全路径
String fileUrl = classNameResult + this.fileExtension;
is = new FileInputStream(this.path + new File(fileUrl));
baos = new ByteArrayOutputStream();
int ch ;
while (-1 != (ch = is.read())) {
baos.write(ch);
}
// 字节数组输出流转换成字节数组
data = baos.toByteArray();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
is.close();
baos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return data;
}
@Override
protected Class<?> findClass(String className) throws ClassNotFoundException {
System.out.println("findClass invoked:" + className);
System.out.println("class loader name" + this.classLoaderName);
byte[] data = this.loadClassData(className);
//返回Class对象
return this.defineClass(className, data, 0 , data.length);
}
@Override
public String toString() {
return "[" + this.classLoaderName + "]";
}
public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
// 创建自定义类加载器 名字“loader1” 父类加载器是系统类加载器
MyTest16 loader1 = new MyTest16("loader1");
//此路径为classPath,故 findClass方法不会被调用执行! 如果换个路径,不是classPath就会去执行了!
loader1.setPath("D:\\eclipse_pj\\dianshang\\jvmTest\\out\\production\\jvmTest\\");
Class<?> clazz = loader1.loadClass("com.jvm.t1.MyTest15");
System.out.println("class:"+ clazz.hashCode());
Object object = clazz.newInstance();
System.out.println(object);
// loader1 指向新的实例
loader1 = new MyTest16("loader1");
//此路径为classPath,故 findClass方法不会被调用执行! 如果换个路径,不是classPath就会去执行了!
loader1.setPath("D:\\eclipse_pj\\dianshang\\jvmTest\\out\\production\\jvmTest\\");
//指向新的
clazz = loader1.loadClass("com.jvm.t1.MyTest15");
System.out.println("class:"+ clazz.hashCode());
// 指向新的
object = clazz.newInstance();
System.out.println(object);
}
}
调用:
public class Test17 {
public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException {
MyTest16 loader1 = new MyTest16("loader1");
loader1.setPath("D:\\test\\jvm\\");
Class<?> clazz = loader1.loadClass("com.jvm.t1.test");
System.out.println("class"+ clazz.hashCode());
Object o = clazz.newInstance();
}
}
写一个自定义类加载器demo的更多相关文章
- Java内存管理-掌握自定义类加载器的实现(七)
勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分析了ClassLoader的类加载相关的核心源码,也简单介绍了ClassLoa ...
- 4.自定义类加载器实现及在tomcat中的应用
了解了类加载器的双亲委派机制, 也知道了双亲委派机制的原理,接下来就是检验我们学习是否扎实了,来自定义一个类加载器 一. 回顾类加载器的原理 还是这张图,类加载器的入口是c++调用java代码创建了J ...
- 手写一个类加载器demo
1.什么是类加载器? 2.加载方式 ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式 ...
- java类加载器学习2——自定义类加载器和父类委托机制带来的问题
一.自定义类加载器的一般步骤 Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制.一个类需要被加载的时候,JVM先会调用他的父类加载器进行加载,父类调用父类的父类,一直到顶级类加载 ...
- Java自定义类加载器与双亲委派模型
其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...
- (转)JVM——自定义类加载器
背景:为什么要自定义,如何自定义,实现过程 转载:http://blog.csdn.net/SEU_Calvin/article/details/52315125 0. 为什么需要自定义类加载器 网上 ...
- JVM自定义类加载器加载指定classPath下的所有class及jar
一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责 ...
- jvm(1)类的加载(二)(自定义类加载器)
[深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...
- JVM——自定义类加载器
)以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节码,为了安全性,这些字节码经过了加密处理.这个时候你就需要自定义类加载器来从某个网络地址上读取加密后的字节代码,接着 ...
随机推荐
- python写txt文件
with open('data.txt','w') as f: #设置文件对象 w是重新写,原来的会被抹掉,a+是在原来的基础上写 str0=u"写文件\n" #写中文要在字符串签 ...
- 设置Oracle PL/SQL时间显示格式NLS_TIMESTAMP_FORMAT
Oracle中TIMESTAMP时间的显示格式 Oracle数据库的时间字段我们通常是使用timestamp 格式,在未做设置前, 查询出来的数据类似于“27-1月 -08 12.04.35.87 ...
- cocos2D-X Doc
{ //https://docs.cocos2d-x.org/api-ref/index.html //https://docs.cocos.com/cocos2d-x/manual/zh/sprit ...
- Linux系统重要文件(三)
一系统运行级别文件 文件路径:/etc/inittab 文件作用说明:定义系统启动后,自动开启哪些软件程序系统 runlevel 查看当前运行级别 centos6系统运行级别: 7个级别 0 ...
- springMVC使用map接收入参 + mybatis使用map 传入查询参数
测试例子: controllel层 ,使用map接收请求参数,通过Debug可以看到,请求中的参数的值都是字符串形式,如果将这个接收参数的map直接传入service,mybatis接收参数时会报错, ...
- 如何隐藏一个让人很难发现的bug?
程序员的日常三件事:写bug.改bug.背锅.连程序员都自我调侃道,为什么每天都在加班?因为我的眼里常含bug. 那么如何写出一个让(坑)人(王)很(之)难(王)发现的bug呢? - 1 - 新手开发 ...
- php chunk_split()函数 语法
php chunk_split()函数 语法 作用:把字符串分割为一连串更小的部分.东莞大理石平板 语法:chunk_split(string,length,end) 参数: 参数 描述 string ...
- Visual Studio 2008 附加进程调试
关于附加进程调试的问题: 在项目当中经常使用“附加到进程”来调试项目,感觉挺方便的.我们做的项目通常都会发布到IIS(特别是B/S),一可以直接通过地址栏输入地址就可以运行项目,不必去使用开发工具来打 ...
- xshell如何传输文件【转】
1.打开xshell工具,连接到服务器. 2.yum安装一款工具. #yum install lrzsz -y 3.检查是否安装成功. #rpm -qa |grep lrzsz 4.上传文件的执行命 ...
- 安卓Activity布局简述
Activity布局简述 基于xml的布局 Main.xml(调用工程res/layout/main.xml定义的界面元素完成布局显示) <?xml version="1.0" ...