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的更多相关文章

  1. Java内存管理-掌握自定义类加载器的实现(七)

    勿在流沙筑高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分析了ClassLoader的类加载相关的核心源码,也简单介绍了ClassLoa ...

  2. 4.自定义类加载器实现及在tomcat中的应用

    了解了类加载器的双亲委派机制, 也知道了双亲委派机制的原理,接下来就是检验我们学习是否扎实了,来自定义一个类加载器 一. 回顾类加载器的原理 还是这张图,类加载器的入口是c++调用java代码创建了J ...

  3. 手写一个类加载器demo

    1.什么是类加载器? 2.加载方式 ClassLoader类加载器,主要的作用是将class文件加载到jvm虚拟机中.jvm启动的时候,并不是一次性加载所有的类,而是根据需要动态去加载类,主要分为隐式 ...

  4. java类加载器学习2——自定义类加载器和父类委托机制带来的问题

    一.自定义类加载器的一般步骤 Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制.一个类需要被加载的时候,JVM先会调用他的父类加载器进行加载,父类调用父类的父类,一直到顶级类加载 ...

  5. Java自定义类加载器与双亲委派模型

    其实,双亲委派模型并不复杂.自定义类加载器也不难!随便从网上搜一下就能搜出一大把结果,然后copy一下就能用.但是,如果每次想自定义类加载器就必须搜一遍别人的文章,然后复制,这样显然不行.可是自定义类 ...

  6. (转)JVM——自定义类加载器

    背景:为什么要自定义,如何自定义,实现过程 转载:http://blog.csdn.net/SEU_Calvin/article/details/52315125 0. 为什么需要自定义类加载器 网上 ...

  7. JVM自定义类加载器加载指定classPath下的所有class及jar

    一.JVM中的类加载器类型 从Java虚拟机的角度讲,只有两种不同的类加载器:启动类加载器和其他类加载器. 1.启动类加载器(Boostrap ClassLoader):这个是由c++实现的,主要负责 ...

  8. jvm(1)类的加载(二)(自定义类加载器)

    [深入Java虚拟机]之四:类加载机制 1,从Java虚拟机的角度,只存在两种不同的类加载器: 1,启动类加载器:它使用C++实现(这里仅限于Hotspot,也就是JDK1.5之后默认的虚拟机,有其他 ...

  9. JVM——自定义类加载器

    )以上两种情况在实际中的综合运用:比如你的应用需要通过网络来传输 Java 类的字节码,为了安全性,这些字节码经过了加密处理.这个时候你就需要自定义类加载器来从某个网络地址上读取加密后的字节代码,接着 ...

随机推荐

  1. ForkJoinPool线程池--分支执行

    import java.util.ArrayList; import java.util.concurrent.ExecutionException; import java.util.concurr ...

  2. JavaSE---多线程---扩展

    1.线程的类型 1.1 用户线程 1.2 内核线程 2.java线程 java线程的创建依赖于系统内核,通过JVM调用系统库创建内核线程: 内核线程与java-Thread是1:1的映射关系: 3.线 ...

  3. The Constructor with No Arguments

    If a class supplies at least one constructor but does not supply a no-argument constructor, it is il ...

  4. SQL Server DBA日常检查常用SQL

    .数据库 --所有数据库的大小 exec sp_helpdb --所有数据库的状态 select name, user_access_desc, --用户访问模式 state_desc, --数据库状 ...

  5. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 GSM Base Station Identification (点在多边形内模板)

    In the Personal Communication Service systems such as GSM (Global System for Mobile Communications), ...

  6. (转)ping: www.baidu.com: Name or service not known centos7 -bash: ifconfig: command not found

    [root@mysqlcentos01 ~]# ping www.baidu.com ping: www.baidu.com: Name or service not known [root@mysq ...

  7. python/pandas 正则表达式 re模块

    目录 正则解说 中文字符集 re模块常用方法 1.正则解说 数量词的贪婪模式与非贪婪模式 正则表达式通常用于在文本中查找匹配的字符串.Python里数量词默认是贪婪的(在少数语言里也可能是默认非贪婪) ...

  8. R 数据分析

    目录: windows命令行中执行R dataframe 常用函数.变量 1.windows命令行中执行R 前提:已经把R的命令目录加入了系统路径中. 在windows中,命令行执行R可以用以下两种方 ...

  9. jmeter添加自定义扩展函数之String---base64加密

    1,打开eclipse,新建maven工程,在pom中引用jmeter核心jar包,具体请看---https://www.cnblogs.com/guanyf/p/10863033.html---,这 ...

  10. R语言利用ROCR评测模型的预测能力

    R语言利用ROCR评测模型的预测能力 说明 受试者工作特征曲线(ROC),这是一种常用的二元分类系统性能展示图形,在曲线上分别标注了不同切点的真正率与假正率.我们通常会基于ROC曲线计算处于曲线下方的 ...