一、sun.misc.Launcher (ExtClassLoader 与 AppClassLoader 的创建)

publicLauncher() {

Launcher.ExtClassLoader var1;try{

var1=Launcher.ExtClassLoader.getExtClassLoader();

}catch(IOException var10) {throw new InternalError("Could not create extension class loader", var10);

}try{this.loader =Launcher.AppClassLoader.getAppClassLoader(var1);

}catch(IOException var9) {throw new InternalError("Could not create application class loader", var9);

}

Thread.currentThread().setContextClassLoader(this.loader);

String var2= System.getProperty("java.security.manager");if (var2 != null) {

SecurityManager var3= null;if (!"".equals(var2) && !"default".equals(var2)) {try{

var3= (SecurityManager)this.loader.loadClass(var2).newInstance();

}catch(IllegalAccessException var5) {

}catch(InstantiationException var6) {

}catch(ClassNotFoundException var7) {

}catch(ClassCastException var8) {

}

}else{

var3= newSecurityManager();

}if (var3 == null) {throw new InternalError("Could not create SecurityManager: " +var2);

}

System.setSecurityManager(var3);

}

}

View Code

二、自定义类加载器(继承 ClassLoader 类,重写 findClass 方法,不推荐重写 loadClass 方法,会破坏委派机制)

测试加载类,使用 javac 把 .java 文件编译成 .class 文件

packagecom;public classHello {static{

System.out.println("Hello !");

}public voidsayHi(String name){

System.out.println("Hello !" +name);

}

}

类加载器,注意要加载类的路径名与包名

packagecom;importjava.io.ByteArrayOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.InputStream;importjava.lang.reflect.Method;public class ClassLoaderTest extendsClassLoader {private final static String filePathSuffix = ".class";privateString filePathPrefix;publicClassLoaderTest(String filePathPrefix) {this.filePathPrefix =filePathPrefix;

}

@Overrideprotected Class> findClass(String name) {

String fileName= name.split("\\.")[name.split("\\.").length - 1];byte[] bytes = loadClassData(filePathPrefix + fileName +filePathSuffix);return defineClass(name, bytes, 0, bytes.length);

}private byte[] loadClassData(String filePath) {

InputStream in= null;

ByteArrayOutputStream out= null;try{

in= new FileInputStream(newFile(filePath));

out= newByteArrayOutputStream();int i = 0;while ((i = in.read()) != -1) {

out.write(i);

}

}catch(Exception e) {

e.printStackTrace();

}finally{try{

out.close();

in.close();

}catch(Exception e) {

e.printStackTrace();

}

}returnout.toByteArray();

}public static void main(String[] args) throwsException {

ClassLoaderTest clt= new ClassLoaderTest("D:/");

Class c= clt.loadClass("com.Hello");

System.out.println(c.getClassLoader());

System.out.println(c.getClassLoader().getParent());

System.out.println(c.getClassLoader().getParent().getParent());

System.out.println(c.getClassLoader().getParent().getParent().getParent());

Method sayHi= c.getMethod("sayHi", String.class);//无参实例化

Object o =c.newInstance();//调用方法

sayHi.invoke(o, "zhangsan");

}

}

三、Class.forName() 和 ClassLoader.loadClass()

调用了 forName0,第二个参数为 true,默认会初始化,可使用其重载方法指定为 false

@CallerSensitivepublic static Class> forName(String className) throwsClassNotFoundException {

Class> caller =Reflection.getCallerClass();return forName0(className, true, ClassLoader.getClassLoader(caller), caller);

}

调用了 loadClass 的重载方法,默认不会链接,就不会初始化了

public Class> loadClass(String name) throwsClassNotFoundException {return loadClass(name, false);

}

以上面的 Hello 类为例,在 com 包下新建同样的文件,命名为 Hello1

public static void main(String[] args) throwsException {//加载,链接,初始化

Class.forName("com.Hello1");

System.out.println("==========================================");//加载,链接

Class.forName("com.Hello1", false,ClassLoader.getSystemClassLoader());

System.out.println("==========================================");//加载

ClassLoader.getSystemClassLoader().loadClass("com.Hello1");

}

四、线程上下文类加载器(ThreadContextClassLoader)

java.lang.Thread 中的方法 getContextClassLoader() 和 setContextClassLoader(ClassLoader cl) 用来获取和设置线程的上下文类加载器。

如果没有通过 setContextClassLoader(ClassLoader cl)方法进行设置的话,线程将继承其父线程的上下文类加载器。

Java 应用运行的初始线程的上下文类加载器是系统类加载器。

Thread thread = new Thread(()->{try{

Class> aClass = Thread.currentThread().getContextClassLoader().loadClass("com.Hello");

System.out.println(aClass.getClassLoader());

}catch(ClassNotFoundException e) {

e.printStackTrace();

}

});

thread.setContextClassLoader(new ClassLoaderTest("D:/"));

thread.start();

Thread.sleep(1000);

thread= new Thread(()->{try{

Class> aClass = Thread.currentThread().getContextClassLoader().loadClass("com.Hello1");

System.out.println(aClass.getClassLoader());

}catch(ClassNotFoundException e) {

e.printStackTrace();

}

});

thread.start();

java 自定义类加载器_Java-JVM 自定义类加载器相关推荐

  1. java 扩展类加载器_java实现自定义类加载器

    各类加载器虽然以父子相称,但是没有继承关系 (视频教程推荐:java课程) 点入ClassLoader的源码查看样例:* * class NetworkClassLoader extends Clas ...

  2. java基础类加载器_Java基础之类加载器

    1. 什么是类加载器? 加载类的工具. 2. Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类: BootStrap,ExtClassLoader,AppC ...

  3. java边界布局东南西北_JAVA swing布局管理器实例解析

    组件在容器(比如Jframe)中的位置和大小是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理. 种类 java共提供了五种布局管理器,只介绍三种是最常见的布局管 ...

  4. java rmi 安全管理器_Java:没有安全管理器:RMI类加载器被禁用

    嗨,我有RMI应用程序,现在我尝试从我的客户端在服务器上调用一些方法.我有以下代码: public static void main(final String[] args) { try { //Se ...

  5. java自定义监听器例子_Java使用自定义注解实现为事件源绑定事件监听器操作示例...

    本文实例讲述了Java使用自定义注解实现为事件源绑定事件监听器操作.分享给大家供大家参考,具体如下: 一 定义注解 import java.lang.annotation.*; import java ...

  6. java 内部类 加载_java内部类及类加载顺序

    package demo; import demo.Enclosingone; import demo.Enclosingone.InsideOne; import demo.Enclosingone ...

  7. java 生成证书图片_java生成自定义证书图片1 - 制作证书word模板

    最近做项目遇到一个需求,生成指定数据的证书图片(比如毕业证,在空的模板中输入自定义的姓名.日期等信息),尝试了许多方法,最终完美地实现了这个需求. 以下内容为制作证书图片的第一步,制作证书word模板 ...

  8. java 生成证书图片_java生成自定义证书图片4

    终于到了生成自定义证书图片的最后一步,pdf转图片我选择使用pdfbox库,以下是工具类: packagecom.x.certificate.pdf;importjava.awt.image.Buff ...

  9. java虚拟机可以处理_Java虚拟机对类加载的处理机制

    类被加载到虚拟机内存开始,到卸载出内存为止,经历了:加载->验证->准备->解析->初始化->使用->卸载 这七个过程 加载 在加载阶段,虚拟机要完成三件事: (1 ...

  10. Java如何加入皮肤_JAVA如何自定义皮肤

    转自 梦续残源 http://mxcyk.com/?post=191 1.[图片] QQ截图20121127164810.png 2.[代码]自己动手给JAVA换肤 package com.mxcyk ...

最新文章

  1. 通过文件读写方式实现Matlab和Modelsim的联合仿真
  2. 微信做入口,微软却想做入口的入口
  3. 还在到处集五福?支付宝其实埋了一个鲜为人知的集福利器!
  4. docker harbor 域名_超详细的搭建docker私服Harbor教程
  5. html5实现3d翻页效果,利用css3 3d transform制作超逼真翻书效果
  6. 作者:王倩(1983-),女,上海计算机软件技术开发中心工程师。
  7. java对象转JSON JS取JSON数据
  8. android 三星 oom,android - 终结者抛出未捕获的异常:谷歌API错误或三星内核错误? - 堆栈内存溢出...
  9. windows2003修改远程桌面连接数
  10. oracle 学习日志--ORACLE EXP命令
  11. PullToRefresh使用详解(四)--利用回调函数实现到底加载
  12. CORS跨域资源共享
  13. 如何让计算机桌面字体变大,如何把字体放大 如何更改桌面与网页字体大小
  14. python实现PDF文件合并成一个文件
  15. PR中我的常用快捷键
  16. excel 引用方式A1引用和R1C1引用,相对引用、绝对引用以及混合引用
  17. ReferenceError: server is not defined
  18. android 8.0 红米note3,红米Note3抢在小米6前面升到8.0,但是bug满天飞
  19. 把故事收回到一杯茶里,不知不觉,茶已经凉了
  20. 亲测可用--word报错:子过程或函数未定义

热门文章

  1. 在C++中可以用3种方法访问一个字符串
  2. PHP无用图片清理,php – 如何在img / p /上删除Prestashop无用的图像
  3. echars x轴单位_echarts X轴和Y轴 坐标没有 一一对应
  4. fastjson jar包_Fastjsonlt;=1.2.47反序列化RCE漏洞(CNVD201922238)
  5. SOL注入——基于联合查询的数字型GET注入(二)
  6. esp定律手动nspack 3.7_ESP定律原理详解
  7. 图片优化_Web 性能优化: 图片优化让网站大小减少 62%
  8. getvalue参数计数不匹配_OpenCV开发笔记(六十八):红胖子8分钟带你使用特征点Flann最邻近差值匹配识别...
  9. C++11之std::async使用介绍
  10. java nio详解,Java NIO API详解