提纲
案例
tomcat:正统的类加载器结构
web服务器要解决的问题:
部署在同一个服务器上的两个web应用程序所使用的java类库可以实现相互隔离。
部署在同一个服务器上的两个web应用程序所使用的java类库可以实现共享。
服务器需要尽可能的保证自身的安全不受部署的web应用程序影响。
支持jsp应用的web服务器,大多数需要支持hotspot功能。
java类库放置在tomcat目录含义:
放置在/common中:类库可被tomcat和所有的web应用程序共同使用。
放置在/server中:类库可被tomcat使用,对所有web程序不可见。
放置在/shared中:类库可被所有的web应用程序共同使用,但对tomcat自己不可见
放置在/WebApp/WEB-INF中:类库仅仅可以被此web程序使用,对tomcat和其它web程序都不可见。
OSGI:灵活的类加载器结构
OSGI的bundle类加载器之间只有规则,没有规定的委派关系。
类加载时的查找规则如下:
以java.*开头的类,委派给父类加载器加载。
否则,委派给列表名单内的类,委派给父类加载器加载。
否则,import列表中的类,委派给export这个类的bundle的类加载器加载。
否则,查找当前bundle的classpath,使用自己的类加载器加载。
否则,查找是否在自己的Fragment Bundle中,如果是,则委派给Fragment Bundle的类加载器加载。
否则,查找Dynamic Import列表中的bundle,委派给对应的类加载器加载。
否则,类查找失败。
字节码生成技术与动态代理的实现
javac命令使用了字节码生成技术。
web服务器中的jsp编译器,编译时植入的aop框架,还有常用的动态代理技术,甚至在使用反射的时候虚拟机都有可能会在运行时生成字节码来提高执行速度。
动态代理中所谓的动态,是针对使用java代码实际编写了代理类的静态代理而言的。它的又是不在于省去了编写代理类的工作量,而是实现了可以在原始类和接口还未知的时候,就确定代理类的行为。
Retrotranslator:跨越jdk版本
java逆向移植工具
jdk升级新增的功能分为4类:
编译器层的改进、对javaapi的代码增强、需要在字节码中进行支持的改动、虚拟机内部的改进