------- android培训、java培训、期待与您交流! ----------
类加载器及其委托机制的深入分析。
(1),由来:JVM将类的字节码(编译好的class文件)加载到内存中。
这是一件很重要的事,这件事是由JVM分配给类加载器在做。
(2),分类:JVM可以有多个加载器。系统默认了3个主要的类加载器。 BootStrap(不是java类),ExtClassLoader,AppClassLoader 负责加载特定位置的类。
(3),特殊:BootStrap。竟然类加载器也是java类,在用到它们的时候。同样,也需要类加载器进行加载。很显然,这个时候就需要一个不是Java类的加载器。需要找到这个鼻祖,充当这个鼻祖的就是:BootStrap。它不是java类。
(4),关系:
每个加载器只能加载指定位置的类。也可以自己定义一个加载器,指定加载
的位置。级别关系:BootStrap->ExtClassLoader->AppClassLoader
体现这种关系的方法是:ClassLoader里面的getParent()方法。
(5),委托
原理,每个类加载器加载类时,都会委托给它的上级加载器。当所有的祖宗都没法加载这个类的时候,就会回到发起者类加载器。还是加载不了,就会抛出
ClassNotFoundException。不会再去找发起者类加载器的儿子,因为没有getChild方法。
好处,可以集中管理。上级加载完后,下级直接哪来用就行了。否则,会加载很多已经加载的类。
面试题:写一个java.lang.System
(6),指定加载器。
首先当前线程的类加载器去加载线程中的第一个类。如果类A中引用了类B,Java虚拟机将使用加载类A的类装载器来加载类B。还可以直接调用ClassLoader对象的.loadClass()方法来用当前的类加载器去加载某个类。
自定义类加载器的编写原理分析。
目标:自定义一个类加载器,并指定加载位置。保证该位置中的类都能被自定义类加载器加载。并且这些类的字节码都有进行加密处理。加载过程中进行解密。
设计模式:模版方法设计模式,父类指定处理大纲,子类规定具体内容的设计模式。一般,在父类中声明子类需要重写的抽象方法(findClass),并且父类中存在一个方法(loadClass)调用了这些方法,保证事件的流程来完成一件相对的大事。
返回字节码:defineClass
protected Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)
使用可选的 ProtectionDomain 将一个 byte 数组转换为 Class 类的实例。
只要得到字节码,完成这一步就算成功了。
编写对class文件进行加密的工具类。
(1),加密方法:
// 定义一个加密方法,对ClassLoaderAttachment进行加密。
public static void cypher(InputStream in, OutputStream out)
throws Exception {
int b = -1;
while ((b = in.read()) != -1) {
b = b ^ 0xff;
out.write(b);
}
in.close();
out.close();
}
(2),findClass方法:
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
String classPath = classDir+"\\"+name.subString(name.lastIndexOf(‘.’)+1)+".class";
FileInputStream fis = null;
ByteArrayOutputStream fos = null;
try {
fis = new FileInputStream(classPath);
fos = new ByteArrayOutputStream();
cypher(fis,fos);
byte[] buf = fos.toByteArray();
// byte[] buf = new byte[fis.available()];
// fis.read(buf);
// 读取class文件,把读取的字节转换成字节码到内存中。
return defineClass(buf, 0, buf.length);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return super.findClass(name);
}
(3),调用:
Class clazz = new MyClassLoader("classloaderlib").loadClass("classloader.ClassLoaderAttachment");
ClassLoader loader = clazz.getClassLoader();
while(loader!=null){
System.out.println(loader.getClass().getName());
loader = loader.getParent();
}
// ClassLoaderAttachment cla = (ClassLoaderAttachment) clazz.newInstance();
System.out.println(loader);
相关推荐
黑马程序员——Android移动开发源码
通过阅读《黑马程序员------类加载器学习注意点》这篇博文,以及对`classLoader.txt`文件的分析,我们可以更深入地掌握类加载器的相关知识,这对于解决实际问题和提升系统性能具有极大的帮助。在实践中不断探索和...
NULL 博文链接:https://xianglachigen.iteye.com/blog/1564376
黑马程序员入学Java知识——精华总结
"黑马程序员Javase笔记"是一个自学者在学习黑马程序员提供的Java全套课程过程中整理的笔记,主要涵盖了Java Standard Edition (Javase) 的核心内容。下面将详细讨论其中的关键知识点。 首先,DOS命令是操作系统中的...
C++黑马程序员学习资料,附赠《InterviewGuide第四版By阿秀》、《LeetCode刷题手册》、《背包问题九讲》、《算法图解》pdf版本,三个基础课程文档手册及三个实验项目,由简到繁分别为《通讯录管理系统》、《职工管理...
黑马程序员是一家知名的IT教育机构,他们提供的Javaweb教材源码是为了帮助学员深入理解和实践Web开发技术。下面将详细介绍JavaWeb的基本概念、核心技术和黑马程序员源码在学习过程中的作用。 1. **JavaWeb基础** ...
黑马程序员 C语言提高课程配套课件 黑马程序员 C语言提高课程配套课件
|--布局加载器的获取 |--广播接收者之开机启动 |--广播接收者之获取管理员权限 |--广播接收者代码注册与卸载 |--广播接收者常用广播的获取 |--应用之分享(隐式意图) |--应用之卸载(隐式意图) |--应用之安装(隐式意图...
【标题】:“黑马程序员测试题部分答案”涵盖了在学习编程过程中可能会遇到的各类测试题目及其解答,主要由“黑马程序员”这个知名的IT教育机构的教学资源衍生而来。这些测试题目的答案,旨在帮助学习者检验自己的...
这是根据黑马程序员中关于Vue11天课程中,跟着视频编写的代码,一行行跟着写出来的,连备注基本也是和视频一样,用的是vscode开发工具,上传的资料已经把node_modules删除了,进入目录后,用cnpm i重新安装一下就...
黑马程序员,C++核心编程
传智播客旗下黑马程序员c++视频课程内部讲义 就是上课时老师翻阅的那个讲义
在B站黑马程序员的Python教程中,你将深入理解Python的基础概念,包括: 1. **变量与数据类型**:Python支持多种数据类型,如整型(int)、浮点型(float)、字符串(str)和布尔型(bool)。此外,还有列表(list...
"黑马程序员代码生成器"是一款专为编程人员设计的实用工具,它可以帮助用户自动生成特定类型的代码,提高开发效率,减少手动编写重复代码的工作量。这个工具可能包含了各种编程语言的模板,例如Java、Python、C++等...
layui ajax 没有node.js功能都可用,高度类似。 黑马刘龙彬老师主讲的大事件项目,整体看完,给...最后,再次给黑马程序员和刘老师点个赞。 说明--ShowDoc https://www.showdoc.com.cn/escook?page_id=3707158761215217
"黑马程序员网上图书商城中的毕业设计资料,代码,数据库设计论文等" 描述进一步细化了这些资源的来源——黑马程序员的网上图书商城,暗示这可能是一个基于在线书店的系统设计项目。资源不仅限于理论知识,还有实际...
内容概要:通过带着读者手写简化版 Spring 框架了解 Spring 核心原理。在手写Spring源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程保留核心功能, ...本代码基于黑马程序员的课程,最好根据课程同步学习
黑马程序员JavaEE49期
本笔记基于黑马程序员的课程内容,全面覆盖了Java Web的基础知识,包括前端开发技术如HTML、CSS、JavaScript,以及后端服务器端的Java Servlet和JSP(Java Server Pages)。 一、前端基础 1. ...