一、Tomcat:正統的類加載器架構
-
CommonClassLoader能加載的類都可以被Catalina ClassLoader和SharedClassLoader使用,從而實現了公有類庫的共用。
-
CatalinaClassLoader和Shared ClassLoader自己能加載的類則與對方相互隔離。
-
WebAppClassLoader可以使用SharedClassLoader加載到的類,但各個WebAppClassLoader實例之間相互隔離。
-
JasperLoader的加載範圍僅僅是這個JSP文件所編譯出來的那一個.Class文件,它出現的目的就是爲了被丟棄:當Web容器檢測到JSP文件被修改時,會替換掉目前的JasperLoader的實例,並通過再建立一個新的Jsp類加載器來實現JSP文件的HotSwap功能。
二、字節碼生成技術與動態代理的實現
三、自己動手實現遠程執行功能
public class JavaClassExecuter {
public static String execute(byte[] classByte){
//清理HackSystem中緩存
HackSystem.clearBuffer ();
//創建Class修改器
ClassModifier cm = new ClassModifier (classByte);
//修改System符號引用爲HackSystem
byte[] modifyBytes = cm.modifyUTF8Constant ("java/lang/System","javasource/jvm/hotswap/HackSystem");
//創建類加載器
HotSwapClassLoader loader = new HotSwapClassLoader ();
//加載修改後的Class
Class clazz = loader.loadByte (modifyBytes);
try {
//反射調用main方法
Method method = clazz.getMethod ("main",new Class[]{String[].class});
method.invoke (null,new String[]{});
}catch (Exception e){
//將異常也輸出到HackSystem中
e.printStackTrace (HackSystem.out);
}
//返回HackSystem中的緩存內容
return HackSystem.getBufferString ();
}
}