【深入理解JAVA虚拟机】第三部分.虚拟机执行子系统.4.类加载及执行子系统的案例与实战

1、概述

Class文件格式与执行引擎这部分中 :

  用户不能控制的:Class文件以何种格式存储,类型何时加载、 如何连接,以及虚拟机如何执行字节码指令等都是由虚拟机直接控制的行为

  用户能控制的:字节码生成类加载器

2、Tomcat:正统的类加载器架构

还是双亲委托模型,继承关系如下图:

 

灰色背景的3个类加载器是JDK默认提供的类加载器 。

CommonClassLoaderCatalinaClassLoaderSharedClassLoaderWebappClassLoader则是Tomcat自己定义的类加载器,它们分别加载/common/*/server/*/shared/*/WebApp/WEB-INF/*中的Java类库。

3、OSGi:灵活的类加载器架构

OSGi[1]Open Service Gateway Initiative)是OSGi联盟(OSGi Alliance)制定的一个基于Java语言的动态模块化规范

核心思想就是可以动态设置类加载器。详略

4、字节码生成技术与动态代理的实现

主要讲动态代理,没看太明白。暂略。

5、Retrotranslator:跨越JDK版本

用来兼容jdk版本,可以让新版本写的代码,跑在老版本的jvm环境里。

原理是做语法回退,把新的语法回退到老的版本上。

所以对虚拟机的升级部分没有办法。

彩蛋:枚举仅仅是一个继承于java.lang.Enum、 自动生成了values()和valueOf()方法的普通Java类而已。

 

6、实战:自己动手实现远程执行功能

目标是:有一个web页面,可以远程对服务器上的代码执行一段在web上写的代码。不需要重启。

总共只写了250行代码(不含客户端侧),这个就很厉害了。

原理:

1、如何编译:  在客户端或服务端编译均可以,不是难事,只要调用java命令即可。

2、如何执行:用类加载器加载这个类,生成一个class对象,然后反射调用方法。

3、如何获取执行结果:在执行的类中把对System.out的符号引用替换为我们准备的PrintStream的符号引用,即修改加载后的Class对象字节码。  

实现略。

原文地址:https://www.cnblogs.com/aoyihuashao/p/10365301.html