`
nigel521
  • 浏览: 12008 次
社区版块
存档分类
最新评论

黑马程序员——类加载器及其委托机制的深入分析

 
阅读更多

------- 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移动开发源码

    黑马程序员——Android移动开发源码

    黑马程序员------类加载器学习注意点

    通过阅读《黑马程序员------类加载器学习注意点》这篇博文,以及对`classLoader.txt`文件的分析,我们可以更深入地掌握类加载器的相关知识,这对于解决实际问题和提升系统性能具有极大的帮助。在实践中不断探索和...

    黑马程序员——赢在习惯

    NULL 博文链接:https://xianglachigen.iteye.com/blog/1564376

    黑马程序员入学Java知识——精华总结

    黑马程序员入学Java知识——精华总结

    黑马程序员Javase笔记

    "黑马程序员Javase笔记"是一个自学者在学习黑马程序员提供的Java全套课程过程中整理的笔记,主要涵盖了Java Standard Edition (Javase) 的核心内容。下面将详细讨论其中的关键知识点。 首先,DOS命令是操作系统中的...

    C++黑马程序员学习资料

    C++黑马程序员学习资料,附赠《InterviewGuide第四版By阿秀》、《LeetCode刷题手册》、《背包问题九讲》、《算法图解》pdf版本,三个基础课程文档手册及三个实验项目,由简到繁分别为《通讯录管理系统》、《职工管理...

    教材源码_javaweb_黑马程序员Javaweb源码_

    黑马程序员是一家知名的IT教育机构,他们提供的Javaweb教材源码是为了帮助学员深入理解和实践Web开发技术。下面将详细介绍JavaWeb的基本概念、核心技术和黑马程序员源码在学习过程中的作用。 1. **JavaWeb基础** ...

    黑马程序员 C语言提高课程配套课件

    黑马程序员 C语言提高课程配套课件 黑马程序员 C语言提高课程配套课件

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--布局加载器的获取 |--广播接收者之开机启动 |--广播接收者之获取管理员权限 |--广播接收者代码注册与卸载 |--广播接收者常用广播的获取 |--应用之分享(隐式意图) |--应用之卸载(隐式意图) |--应用之安装(隐式意图...

    黑马程序员测试题部分答案

    【标题】:“黑马程序员测试题部分答案”涵盖了在学习编程过程中可能会遇到的各类测试题目及其解答,主要由“黑马程序员”这个知名的IT教育机构的教学资源衍生而来。这些测试题目的答案,旨在帮助学习者检验自己的...

    黑马程序员Vue深入浅出视频代码

    这是根据黑马程序员中关于Vue11天课程中,跟着视频编写的代码,一行行跟着写出来的,连备注基本也是和视频一样,用的是vscode开发工具,上传的资料已经把node_modules删除了,进入目录后,用cnpm i重新安装一下就...

    黑马程序员,C++核心编程

    黑马程序员,C++核心编程

    传智播客旗下黑马程序员c++视频课程内部讲义

    传智播客旗下黑马程序员c++视频课程内部讲义 就是上课时老师翻阅的那个讲义

    B站黑马程序员Python教程学习笔记.zip

    在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

    黑马程序员毕业设计资料,代码,数据库设计论文等

    "黑马程序员网上图书商城中的毕业设计资料,代码,数据库设计论文等" 描述进一步细化了这些资源的来源——黑马程序员的网上图书商城,暗示这可能是一个基于在线书店的系统设计项目。资源不仅限于理论知识,还有实际...

    黑马程序员ssm代码分享

    内容概要:通过带着读者手写简化版 Spring 框架了解 Spring 核心原理。在手写Spring源码的过程中会摘取整体框架中的核心逻辑,简化代码实现过程保留核心功能, ...本代码基于黑马程序员的课程,最好根据课程同步学习

    黑马程序员JavaEE49期

    黑马程序员JavaEE49期

    黑马程序员JAVA WEB全笔记pdf

    本笔记基于黑马程序员的课程内容,全面覆盖了Java Web的基础知识,包括前端开发技术如HTML、CSS、JavaScript,以及后端服务器端的Java Servlet和JSP(Java Server Pages)。 一、前端基础 1. ...

Global site tag (gtag.js) - Google Analytics