java学习笔记-类的加载器
目录
第一节 概述
1.类加载的分类
2. 类加载器的必要性
3. 命名空间
4. 类加载机制的基本特征
第二节 类的加载器分类
概述
1. 引导类加载器
2. 扩展类加载器
3. 系统类加载器
4. 用户自定义类加载器
第三节 测试不同的类加载器
第四节 ClassLoader 源码解析
1. ClassLoader 的主要方法
2. SecureClassLoader 与 与 URLClassLoader
3. ExtClassLoader 与 与 AppClassLoader
4. Class.forName() 与 与 ClassLoader.loadClass()
第五节 双亲委派模型
1. 定义与本质
2. 优势与劣势
3. 破坏双亲委派机制
第六节 自定义类加载器及热替换的实现
第一节 概述
1.类加载的分类
2. 类加载器的必要性
3. 命名空间
4. 类加载机制的基本特征
第二节 类的加载器分类
概述
class ClassLoader {ClassLoader parent; //父类加载器public ClassLoader(ClassLoader parent) {this.parent = parent;}
}class ParentClassLoader extends ClassLoader {public ParentClassLoader(ClassLoader parent) {super(parent);}
}class ChildClassLoader extends ClassLoader {public ChildClassLoader(ClassLoader parent) {//parent = new ParentClassLoader();super(parent);}
}
1. 引导类加载器
- 注意:第五条那个父类加载器的意思并不是指继承,是一个上层的关系,前面有讲到。
- 引导类加载器是获取不到的,C/C++实现的
2. 扩展类加载器
3. 系统类加载器
4. 用户自定义类加载器
第三节 测试不同的类加载器
这个java.lang.String就是空,因为java包下的是用bootstrap
第四节 ClassLoader 源码解析
1. ClassLoader 的主要方法
protected Class<?> loadClass(String name, boolean resolve) //resolve:true 加载 Class 的同
时进行解析操作
throws ClassNotFoundException
{synchronized (getClassLoadingLock(name)) { //同步操作,保证只能加载一次// 首先,在缓存中判断是否已经加载同名类// First, check if the class has already been loadedClass<?> c = findLoadedClass(name);if (c == null) {long t0 = System.nanoTime();try {// 获取当前类加载类的父类加载器if (parent != null) {// 如果存在父类加载器,则调用父类加载器进行类加载c = parent.loadClass(name, false);} else { // parent 为 null :父类加载器是引导类加载器c = findBootstrapClassOrNull(name);}} catch (ClassNotFoundException e) {// ClassNotFoundException thrown if class not found// from the non-null parent class loader}if (c == null) { // 当前类的加载器的父类加载未加载其此类 or 当前类的加载器未加载此类// If still not found, then invoke findClass in order// to find the class.long t1 = System.nanoTime();c = findClass(name);// this is the defining class loader; record the statsPerfCounter.getParentDelegationTime().addTime(t1 - t0);PerfCounter.getFindClassTime().addElapsedTimeFrom(t1);PerfCounter.getFindClasses().increment();}}if (resolve) {//是否进行解析操作resolveClass(c);}return c;}
}
2. SecureClassLoader 与 与 URLClassLoader
3. ExtClassLoader 与 与 AppClassLoader
4. Class.forName() 与 与 ClassLoader.loadClass()
第五节 双亲委派模型
1. 定义与本质
2. 优势与劣势
3. 破坏双亲委派机制
第六节 自定义类加载器及热替换的实现
- 自定义类加载器
public class MyClassLoader extends ClassLoader {private String classPath;//字节码路径public MyClassLoader(String classPath){this.classPath = classPath;}/*重写此方法不会破坏双亲委派机制*/@Overrideprotected Class<?> findClass(String name) throws ClassNotFoundException{String fileName = classPath + "/" + name + ".class";BufferedInputStream bis = null;try {bis = new BufferedInputStream(new FileInputStream(fileName));//用一个流去读取.class文件} catch (FileNotFoundException e) {
// e.printStackTrace();}//字节数组输出流ByteArrayOutputStream baos = new ByteArrayOutputStream();int len;byte[] data = new byte[1024];try {//将class文件输出到字节数组输出流while (bis != null && (len = bis.read(data)) != -1){baos.write(data,0,len);}if (bis == null) return null;byte[] byteCodes = baos.toByteArray();bis.close();baos.close();//调用本地的加载方法return defineClass(null,byteCodes,0,byteCodes.length);}catch (IOException e){}return null;}}
- UserService类
public class UserService {public void save(){System.out.println("好撒旦撒啊好啊");}
}
- 测试类及具体实现
public class MyClassLoaderTest {public static void main(String[] args) throws ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException {//.class文件的路径,这里就是out文件夹的路径String classPath = "D:\\buildproject\\jvm-study\\out\\production\\jvm-01\\com\\vuhen\\jvmIn\\study08";Thread thread = new Thread(new MyThread(classPath));//不断创建自定义类加载器类实例的线程,实现热部署thread.start();}
}
class MyThread implements Runnable{private String classPath;public MyThread(String classPath) {this.classPath = classPath;}@Overridepublic void run() {while (true){try {//自定义类加载器MyClassLoader classLoader = new MyClassLoader(classPath);//加载类字节码文件Class clazz1 = classLoader.loadClass("UserService");if (clazz1 == null) continue;//创建实例对象Object userService = clazz1.newInstance();//获取save方法Method method = clazz1.getDeclaredMethod("save");//调用方法method.invoke(userService);} catch (IllegalAccessException e) {e.printStackTrace();} catch (InvocationTargetException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (InstantiationException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}}}
}
java学习笔记-类的加载器相关推荐
- amba simple class驱动_学习笔记:class加载器和双亲委派模型
类加载器 类加载器有四种 启动类加载器(Bootstrap ClassLoader) 负责加载 JAVA_HOMElib ⽬录中的,或通过-Xbootclasspath参数指定路径中的且被虚拟机认可( ...
- java虚拟机预先加载哪些类_Java虚拟机JVM学习02 类的加载概述
Java虚拟机JVM学习02 类的加载概述 类的加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对 ...
- java 内部类 加载_举例讲解Java的内部类与类的加载器
内部类 class A { //Inner1 要在 A 初始化后 才能使用,即要被A的对象所调用 class Inner1 { int k = 0; // static int j = 0; //A加 ...
- Day18 (一)类的加载器
一个运行时的Java虚拟机(JVM)负责运行一个Java程序. 当启动一个Java程序时,一个虚拟机实例诞生:当程序关闭退出,这个虚拟机实例也就随之消亡. 如果在同一台计算机上同时运行多个Java程序 ...
- java 根据类名示例化类_如何使用示例从Java中的类路径加载资源
java 根据类名示例化类 Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为Input ...
- 如何使用示例从Java中的类路径加载资源
Java中的类路径不仅用于加载.class文件,而且还可以用于加载资源,例如属性文件,图像,图标,缩略图或任何二进制内容. Java提供了API来将这些资源读取为InputStream或URL. 假设 ...
- java spring包_java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式...
java 自定义加载器,加载spring包,动态加载实现,jar包隔离,tomcat加载webapp方式 发布时间:2018-08-20 12:02, 浏览次数:774 , 标签: java spri ...
- 类的加载器的介绍 和 类的加载过程
java的3大加载器 引导类加载器 BootStrapClassLoader 扩展类加载器 ExtensionClassLoader 应用程序类加载器 ApplicationClassLoader 三 ...
- WEB——BaseDao、注解、Servlet3.0、动态代理、类的加载器
**编写BaseDao** 1.dao持久层怎么来写的? 2.编写通用的BaseDao,其他的Dao的持久层继承BaseDao,提供增删改查的方法了. 3. ...
最新文章
- qDebug 的用法
- java 启动 jetty_如何通过命令行启动或者关闭 Jetty 服务器
- Response 输出文件流过程中的等待效果
- linux注册平台驱动,关于Linux驱动的平台注册方式-- platform_driver_register
- 【C++ STL学习之四】容器list深入学习
- easypoi 导入oracle,记一次由openjdk导致的poi错误(easyexcel)
- [USACO13DEC]牛奶调度Milk Scheduling
- 化工企业数据分析平台项目之应收款分析
- Java基础之字符串详细比较
- 我买的开发板——大虾网DX32(for STM32)
- 四个球队,单循环比赛,平局每队各得一分,胜利得3分,输不得分,最后各队得分是连续的四个自然数,求第二名的得分...
- 连接池原理解读,各个连接池对比
- 数据分析师的职业发展路径是怎样的?
- 奥斯汀页眉怎么设置_wps怎么只删除本页的页眉_Word页眉的设置和删除,这些问题你有遇到过吗?...
- React 事件处理
- 设置U盘盘符为自定义图片
- 【AE扩展插件问题解决记录】
- Html .CSS JQUERY (magnifier)实现详情页面特效
- webgame qlj
- iOS - 动态库上架瘦身(去调虚拟机架构),不然验证会报错。