java 自定义类加载器_Java-JVM 自定义类加载器
一、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 自定义类加载器相关推荐
- java 扩展类加载器_java实现自定义类加载器
各类加载器虽然以父子相称,但是没有继承关系 (视频教程推荐:java课程) 点入ClassLoader的源码查看样例:* * class NetworkClassLoader extends Clas ...
- java基础类加载器_Java基础之类加载器
1. 什么是类加载器? 加载类的工具. 2. Java虚拟机中可以安装多个类加载器,系统默认三个主要的类加载器,每个类负责加载特定位置的类: BootStrap,ExtClassLoader,AppC ...
- java边界布局东南西北_JAVA swing布局管理器实例解析
组件在容器(比如Jframe)中的位置和大小是由布局管理器来决定的.所有的容器都会使用一个布局管理器,通过它来自动进行组件的布局管理. 种类 java共提供了五种布局管理器,只介绍三种是最常见的布局管 ...
- java rmi 安全管理器_Java:没有安全管理器:RMI类加载器被禁用
嗨,我有RMI应用程序,现在我尝试从我的客户端在服务器上调用一些方法.我有以下代码: public static void main(final String[] args) { try { //Se ...
- java自定义监听器例子_Java使用自定义注解实现为事件源绑定事件监听器操作示例...
本文实例讲述了Java使用自定义注解实现为事件源绑定事件监听器操作.分享给大家供大家参考,具体如下: 一 定义注解 import java.lang.annotation.*; import java ...
- java 内部类 加载_java内部类及类加载顺序
package demo; import demo.Enclosingone; import demo.Enclosingone.InsideOne; import demo.Enclosingone ...
- java 生成证书图片_java生成自定义证书图片1 - 制作证书word模板
最近做项目遇到一个需求,生成指定数据的证书图片(比如毕业证,在空的模板中输入自定义的姓名.日期等信息),尝试了许多方法,最终完美地实现了这个需求. 以下内容为制作证书图片的第一步,制作证书word模板 ...
- java 生成证书图片_java生成自定义证书图片4
终于到了生成自定义证书图片的最后一步,pdf转图片我选择使用pdfbox库,以下是工具类: packagecom.x.certificate.pdf;importjava.awt.image.Buff ...
- java虚拟机可以处理_Java虚拟机对类加载的处理机制
类被加载到虚拟机内存开始,到卸载出内存为止,经历了:加载->验证->准备->解析->初始化->使用->卸载 这七个过程 加载 在加载阶段,虚拟机要完成三件事: (1 ...
- Java如何加入皮肤_JAVA如何自定义皮肤
转自 梦续残源 http://mxcyk.com/?post=191 1.[图片] QQ截图20121127164810.png 2.[代码]自己动手给JAVA换肤 package com.mxcyk ...
最新文章
- 通过文件读写方式实现Matlab和Modelsim的联合仿真
- 微信做入口,微软却想做入口的入口
- 还在到处集五福?支付宝其实埋了一个鲜为人知的集福利器!
- docker harbor 域名_超详细的搭建docker私服Harbor教程
- html5实现3d翻页效果,利用css3 3d transform制作超逼真翻书效果
- 作者:王倩(1983-),女,上海计算机软件技术开发中心工程师。
- java对象转JSON JS取JSON数据
- android 三星 oom,android - 终结者抛出未捕获的异常:谷歌API错误或三星内核错误? - 堆栈内存溢出...
- windows2003修改远程桌面连接数
- oracle 学习日志--ORACLE EXP命令
- PullToRefresh使用详解(四)--利用回调函数实现到底加载
- CORS跨域资源共享
- 如何让计算机桌面字体变大,如何把字体放大 如何更改桌面与网页字体大小
- python实现PDF文件合并成一个文件
- PR中我的常用快捷键
- excel 引用方式A1引用和R1C1引用,相对引用、绝对引用以及混合引用
- ReferenceError: server is not defined
- android 8.0 红米note3,红米Note3抢在小米6前面升到8.0,但是bug满天飞
- 把故事收回到一杯茶里,不知不觉,茶已经凉了
- 亲测可用--word报错:子过程或函数未定义
热门文章
- 在C++中可以用3种方法访问一个字符串
- PHP无用图片清理,php – 如何在img / p /上删除Prestashop无用的图像
- echars x轴单位_echarts X轴和Y轴 坐标没有 一一对应
- fastjson jar包_Fastjsonlt;=1.2.47反序列化RCE漏洞(CNVD201922238)
- SOL注入——基于联合查询的数字型GET注入(二)
- esp定律手动nspack 3.7_ESP定律原理详解
- 图片优化_Web 性能优化: 图片优化让网站大小减少 62%
- getvalue参数计数不匹配_OpenCV开发笔记(六十八):红胖子8分钟带你使用特征点Flann最邻近差值匹配识别...
- C++11之std::async使用介绍
- java nio详解,Java NIO API详解