亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

學習Tomcat動態加載JSP的Class類

2019-11-14 23:29:20
字體:
來源:轉載
供稿:網友
學習Tomcat動態加載jsp的Class類

今天在修改項目一個JSP文件時,突然想到Tomat是怎么實現動態實時加載JSP編譯后的class類的?

查了半天資料,看了很多文章,終于明白是怎么回事了:ClassLoader,當tomcat發現jsp改變后,將用新的ClassLoader去加載新的類

具體原理我將單獨總結一下,這里簡單實現了動態加載類

1.定義服務類

public class Servlet {    public void service(){        System.out.

2.定義服務線程

public class ServiceThread extends Thread{    public void run(){        try {            ClassLoader classLoader = this.getContextClassLoader();            Class clazz = classLoader.loadClass("Servlet");            Method service = clazz.getMethod("service", null);            service.invoke(clazz.newInstance(), null);        } catch (Exception e) {            e.printStackTrace();        }    }}

3.自定義ClassLoader

public class MyClassLoader extends ClassLoader{    @Override    public Class loadClass(String name, boolean resolve) throws ClassNotFoundException{        try {                        // 我們要創建的Class對象            Class clasz = null;            // 必需的步驟1:如果類已經在系統緩沖之中            // 我們不必再次裝入它            clasz = findLoadedClass(name);            if (clasz != null)                return clasz;            try {                // 讀取經過加密的類文件                if(name.equals("Servlet")){            //加載class文件字節                    byte classData[] = Util.readFile(ProgramPathHelper.getProgramPath()+"/"+name + ".class");                    if (classData != null) {                        // ... 再把它轉換成一個類                        clasz = defineClass(name, classData, 0,                                classData.length);                    }                }                            } catch (Exception e) {                e.printStackTrace();            }                        // 必需的步驟2:如果上面沒有成功            // 我們嘗試用默認的ClassLoader裝入它            if (clasz == null)                clasz = findSystemClass(name);            // 必需的步驟3:如有必要,則裝入相關的類            if (resolve && clasz != null)                resolveClass(clasz);            // 把類返回給調用者            return clasz;        } catch (Exception ie) {            throw new ClassNotFoundException(ie.toString());        }     }}

4.實現文件監聽類

public class CCFileListener implements FileAlterationListener{    public static HashMap<String,ClassLoader> claMap = new HashMap<String, ClassLoader>();        ZJPFileMonitor monitor = null;    @Override    public void onStart(FileAlterationObserver observer) {        //System.out.println("onStart");    }    @Override    public void onDirectoryCreate(File directory) {        System.out.println("onDirectoryCreate:" +  directory.getName());    }    @Override    public void onDirectoryChange(File directory) {        System.out.println("onDirectoryChange:" + directory.getName());    }    @Override    public void onDirectoryDelete(File directory) {        System.out.println("onDirectoryDelete:" + directory.getName());    }    @Override    public void onFileCreate(File file) {        System.out.println("onFileCreate:" + file.getName());        dyncLoadClass(file.getName());    }    @Override    public void onFileChange(File file) {     //文件改變處理函數        System.out.println("onFileChange : " + file.getName());                dyncLoadClass(file.getName());            }        private void dyncLoadClass(String className){        if(className.contains("Servlet")){//            ZJPFileMonitor.thread.setContextClassLoader(new MyClassLoader());            claMap.put(className, new MyClassLoader());        }    }    @Override    public void onFileDelete(File file) {        System.out.println("onFileDelete :" + file.getName());    }    @Override    public void onStop(FileAlterationObserver observer) {        //System.out.println("onStop");    }}
public class CCFileMonitor {            FileAlterationMonitor monitor = null;    public CCFileMonitor(long interval) throws Exception {        monitor = new FileAlterationMonitor(interval);    }    public void monitor(String path, FileAlterationListener listener) {        FileAlterationObserver observer = new FileAlterationObserver(new File(path));        monitor.addObserver(observer);        observer.addListener(listener);    }    public void stop() throws Exception{        monitor.stop();    }    public void start() throws Exception {        monitor.start();    }    public static void main(String[] args) throws Exception {        CCFileMonitor m = new CCFileMonitor(5000);        m.monitor(ProgramPathHelper.getProgramPath(),new CCFileListener());        m.start();                Servlet servlet = new Servlet();        servlet.service();        MyClassLoader defaultCl = new MyClassLoader();        while(true){                        Thread.currentThread().sleep(3000);                            Thread t = new ServiceThread();                //設置新線程的類加載器                ClassLoader classLoader = CCFileListener.claMap.get("Servlet.class");                if(classLoader==null){                    classLoader = defaultCl;                }                                t.setContextClassLoader(classLoader);                t.start();                            }        }}
public static HashMap<String,ClassLoader> claMap = new HashMap<String, ClassLoader>();在監聽到文件改變后,依據類名重new一個類加載器,用于加載類。
 ClassLoader classLoader = CCFileListener.claMap.get("Servlet.class");
if(classLoader==null){   classLoader = defaultCl;}
 首先獲取類名對應的加載器,如果沒有使用默認的加載器
 ClassLoader classLoader = this.getContextClassLoader(); Class clazz = classLoader.loadClass("Servlet"); Method service = clazz.getMethod("service", null); service.invoke(clazz.newInstance(), null);在線程內部使用剛才在外部設置的線程上下文加載器加載新的Servlet,并執行

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
色综合色综合久久综合频道88| 国产精品男人爽免费视频1| 精品呦交小u女在线| 日本道色综合久久影院| 久久久久久久久亚洲| 欧美有码在线观看| 97高清免费视频| 精品亚洲一区二区三区| 亚洲美女av网站| 中文字幕亚洲综合久久筱田步美| 欧美在线视频网站| 伊人久久男人天堂| 91在线观看欧美日韩| 最新国产成人av网站网址麻豆| 国产精品成人在线| 日日骚av一区| 国产精品久久久久久久久免费| 精品成人av一区| 国精产品一区一区三区有限在线| 91精品久久久久久久久久久| 久久亚洲国产精品| 91亚洲永久免费精品| 亚洲精品一区久久久久久| 欧美激情a∨在线视频播放| 不卡av电影在线观看| 久久久极品av| 日韩成人在线视频网站| 亚洲品质视频自拍网| 日韩欧美在线看| 国产999精品久久久| 欧美一乱一性一交一视频| 亚洲国产精彩中文乱码av在线播放| 成人欧美一区二区三区黑人| 国产精品日韩欧美综合| 日韩欧美在线视频观看| 久久噜噜噜精品国产亚洲综合| 午夜精品美女自拍福到在线| 成人在线免费观看视视频| 国产欧美日韩专区发布| 亚洲va欧美va在线观看| 成人欧美在线观看| 精品国产31久久久久久| 亚洲男人7777| 综合136福利视频在线| 亚洲韩国青草视频| 国产一区二区三区在线观看网站| 亚洲欧美变态国产另类| 亚洲欧美中文日韩在线v日本| 欧美日韩午夜视频在线观看| 精品久久久久久久久久久久| 色樱桃影院亚洲精品影院| 日韩美女av在线免费观看| 国产精品一区av| 久久视频在线直播| 成人黄色在线播放| 日韩av成人在线| 91九色单男在线观看| 久久久www成人免费精品张筱雨| 国语自产精品视频在线看| 亚洲欧美在线一区二区| 久热在线中文字幕色999舞| 久久久噜噜噜久噜久久| 国产女人18毛片水18精品| 成人欧美一区二区三区黑人孕妇| 久久久久久久久久久免费| 欧美夜福利tv在线| 91在线精品播放| 欧美日韩国产精品一区二区不卡中文| 国产精品高潮呻吟久久av野狼| 国产精品免费看久久久香蕉| 欧美大尺度电影在线观看| 中文字幕亚洲天堂| 成人午夜激情网| 精品视频一区在线视频| 亚洲精品黄网在线观看| 久久99视频精品| 在线视频欧美日韩精品| 国产精品午夜国产小视频| 欧美一级高清免费| 久久久av亚洲男天堂| 欧美成人中文字幕在线| 亚洲色图偷窥自拍| 欧美精品福利视频| 亚洲永久在线观看| 国产精品mp4| 中文字幕日韩欧美在线| 国产日韩精品在线播放| 亚洲伊人成综合成人网| 91午夜在线播放| 色综合导航网站| 在线播放精品一区二区三区| 国产午夜精品美女视频明星a级| 欧美日本在线视频中文字字幕| 午夜欧美不卡精品aaaaa| 国产精品手机播放| 国产精品露脸自拍| 日韩av在线一区| 国产精品第3页| 高清欧美性猛交xxxx黑人猛交| 欧美色图在线视频| 成人黄色中文字幕| 国产一区二区久久精品| 最近日韩中文字幕中文| 日韩av影院在线观看| 国产精品一区二区久久国产| 久久伊人免费视频| 亚洲成人av在线播放| 538国产精品一区二区免费视频| 欧美人在线视频| 国产成人亚洲精品| 国产精品∨欧美精品v日韩精品| 亚洲人成网站999久久久综合| 日韩电影在线观看免费| 日韩欧美成人精品| 91精品在线播放| 成人黄色免费网站在线观看| 国产精品直播网红| 国产精品久久久久免费a∨大胸| 日韩国产精品一区| 在线看日韩欧美| 97久久精品人人澡人人爽缅北| 久久好看免费视频| 国产精品高清在线| 国产精品成人av性教育| 久久久久999| 亚洲精品欧美日韩| 九九视频这里只有精品| 福利一区福利二区微拍刺激| 日韩精品999| 久久久精品电影| 日韩高清电影免费观看完整| 91精品国产色综合久久不卡98口| 91久久久久久久久| 最近2019中文免费高清视频观看www99| 日韩美女福利视频| 久久久久久久久久久国产| 欧美不卡视频一区发布| 久久av在线播放| 国产成人精品免高潮在线观看| 国产成人精品久久| 亚洲xxxx做受欧美| 69视频在线免费观看| 久久久久女教师免费一区| 日韩av电影院| 亚洲精品国偷自产在线99热| 日韩亚洲欧美中文高清在线| 国产精品自产拍高潮在线观看| 欧洲精品毛片网站| 欧美精品在线播放| 国产精品成人va在线观看| 国内精品一区二区三区四区| 精品久久久视频| 国产亚洲欧洲在线| 国产精品91一区| 92福利视频午夜1000合集在线观看| 欧美高清理论片| 国产精品日日做人人爱| 欧美一级高清免费播放| 国产成人综合亚洲| 久久精品中文字幕电影| 国产精品pans私拍| 热久久免费视频精品| 亚洲人a成www在线影院| 亚洲综合在线做性|