Java类加载器学习笔记
今后一段时间会全面读一下《深入理解Java虚拟机》
在这里先记一下在网上看到的几篇介绍 类加载器 的文章,等读到虚拟机类加载机制再详细介绍。
贴一个自己写的类加载器。
Hello类。 把编译后的class文件放到别的路径下。
package ww;
public class Hello {
public void say() {
System.out.println("hello world");
}
}
WwClassLoader类。 继承ClassLoader类 重写 findClass()方法
package ww; import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException; public class WwClassLoader extends ClassLoader { private String path; //路径
public WwClassLoader(String path) {
this.path = path;
} @Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String fileName = parseFileName(name);
File file = new File(path,fileName);
try {
//读取class文件
FileInputStream fis = new FileInputStream(file);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int lenth = ;
while((lenth = fis.read()) != -) {
baos.write(lenth);
}
byte[] buffer = baos.toByteArray();
baos.close();
fis.close();
//实例化class对象
return defineClass(name,buffer,,buffer.length);
} catch (Exception e) {
e.printStackTrace();
}
return super.findClass(name);
} //解析文件路径
private String parseFileName(String name) {
int index = name.lastIndexOf('.');
if(index == -) {
return name+".class";
} else {
return name.substring(index+)+".class";
}
}
}
WwTest类。 调用测试
package ww;
import java.lang.reflect.Method;
public class WwTest {
public static void main(String[] args) {
//我一直在找为什么自己定义的类的parent节点一定是AppClassLoader类的源码。要是知道的大佬可以告诉我一声
/*private static native void registerNatives();
static {
registerNatives();
}*/
WwClassLoader ww = new WwClassLoader("E://lib");
try {
Class hel = ww.findClass("ww.Hello");
//反射执行方法
if (hel != null) {
Object obj = hel.newInstance();
Method method = hel.getDeclaredMethod("say", null);
method.invoke(obj, null);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
Java类加载器学习笔记的更多相关文章
- JAVA 类加载机制学习笔记
JAVA 类生命周期 如上图所示,Java类的生命周期如图所示,分别为加载.验证.准备.解析.初始化.使用.卸载.其中验证.准备.解析这三个步骤统称为链接. 加载:JVM根据全限定名来获取一段二进制字 ...
- java类加载器学习2——自定义类加载器和父类委托机制带来的问题
一.自定义类加载器的一般步骤 Java的类加载器自从JDK1.2开始便引入了一条机制叫做父类委托机制.一个类需要被加载的时候,JVM先会调用他的父类加载器进行加载,父类调用父类的父类,一直到顶级类加载 ...
- java类加载器行为[笔记]
1. Java虚拟机使用第一个类的第一件事情就是将该类的字节码装进来,装载类字节码的功能是由类装器完成的,类半遮器负责根据一个类的名称来定位和生成类的字节码数据后返回给Java虚拟机. 2. 类装载器 ...
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- 《深入理解Java虚拟机》学习笔记之类加载
之前在学习ASM时做了一篇笔记<Java字节码操纵框架ASM小试>,笔记里对类文件结构做了简介,这里我们来回顾一下. Class类文件结构 在Java发展之初设计者们发布规范文档时就刻意把 ...
- java笔记--理解java类加载器以及ClassLoader类
类加载器概述: java类的加载是由虚拟机来完成的,虚拟机把描述类的Class文件加载到内存,并对数据进行校验,解析和初始化,最终形成能被java虚拟机直接使用的java类型,这就是虚拟机的类加载机制 ...
- java之jvm学习笔记四(安全管理器)
java之jvm学习笔记四(安全管理器) 前面已经简述了java的安全模型的两个组成部分(类装载器,class文件校验器),接下来学习的是java安全模型的另外一个重要组成部分安全管理器. 安全管理器 ...
- java之jvm学习笔记五(实践写自己的类装载器)
java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类 ...
- java之jvm学习笔记二(类装载器的体系结构)
java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...
随机推荐
- unittest 常用的断言方法
1.assertEqual(self, first, second, msg=None) --判断两个参数相等:first == second 2.assertNotEqual(self, first ...
- NodeJS链接MySql数据库
//1.用npm命令安装mysql模块 npm install mysql //2.js文件中引入mysql模块 const mysqlModule = require('mysql'); //3.创 ...
- 移除jboss响应中的中间件信息
JBoss 4.2 Suppressing the X-Powered-By header in JBoss 4.2.x can be done by modifying the web.xml fi ...
- web.config中的InProc模式 与 StateServer模式[转]
开发asp.net应用时,修改web.config中的SessionState节点. <sessionState mode="StateServer" stateConnec ...
- 清空数据库错误:因为该表正由 FOREIGN KEY 约束引用 解决办法
如下解决了五个问题 1. 清空数据 2. 有外键也可以, 因为是逆向删除, 从最后一张表删除. 且使用的是delete, 因为truncate不能对有外键的表 3. 种子问题, 如果表存在种子重设为0 ...
- Linux之添加交换分区
Linux下的交换分区我们可以随意改变大小,如果说日常生活中分区不够用,今天我们来举个例子如何添加. 1.首先是使用dd命令创建一个空文件,这个空文件的大小就是你要继续添加的swap的大小,比如我这里 ...
- MySQL索引原理以及类型
1.什么是索引 索引是在MySQL的存储引擎上,对其表中的某个列或多列通过一些算法实现可快速查询出结果的一种方法. 2.为什么要有索引 就像一本书要有目录一样,我们可快速通过目录来查找对应的章节得出结 ...
- 各种SQL查询技巧汇总 (转)
原文地址: https://blog.csdn.net/tim_phper/article/details/54963828 select select * from student; all 查询所 ...
- 补码与C++的应用
12.inti=(int)((unsigned int)0xffffffff+(unsigned int)0xffffffff); printf(“%d”,i);结果是:C A.0 ...
- ethereum/EIPs-725
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-725.md eip title author discussions-to status ...