欧美三区_成人在线免费观看视频_欧美极品少妇xxxxⅹ免费视频_a级毛片免费播放_鲁一鲁中文字幕久久_亚洲一级特黄

學(xué)習(xí)Tomcat動態(tài)加載JSP的Class類

系統(tǒng) 1919 0

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

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

具體原理我將單獨總結(jié)一下,這里簡單實現(xiàn)了動態(tài)加載類

1.定義服務(wù)類

      
        public
      
      
        class
      
      
         Servlet {



    
      
      
        public
      
      
        void
      
      
         service(){

        System.out.println(
      
      "運行服務(wù)方法"
      
        );

    }

    

}
      
    

2.定義服務(wù)線程

      
        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
      
      
         {

            

            
      
      
        //
      
      
         我們要創(chuàng)建的Class對象
      
      

            Class clasz = 
      
        null
      
      
        ;



            
      
      
        //
      
      
         必需的步驟1:如果類已經(jīng)在系統(tǒng)緩沖之中

            
      
      
        //
      
      
         我們不必再次裝入它
      
      

            clasz =
      
         findLoadedClass(name);



            
      
      
        if
      
       (clasz != 
      
        null
      
      
        )

                
      
      
        return
      
      
         clasz;

            
      
      
        try
      
      
         {

                
      
      
        //
      
      
         讀取經(jīng)過加密的類文件
      
      
        if
      
      (name.equals("Servlet"
      
        )){
        
            //加載class文件字節(jié)
byte classData[] = Util.readFile(ProgramPathHelper.getProgramPath()+"/"+name + ".class" ); if (classData != null ) { // ... 再把它轉(zhuǎn)換成一個類 clasz = defineClass(name, classData, 0 , classData.length); } } } catch (Exception e) { e.printStackTrace(); } // 必需的步驟2:如果上面沒有成功 // 我們嘗試用默認的ClassLoader裝入它 if (clasz == null ) clasz = findSystemClass(name); // 必需的步驟3:如有必要,則裝入相關(guān)的類 if (resolve && clasz != null ) resolveClass(clasz); // 把類返回給調(diào)用者 return clasz; } catch (Exception ie) { throw new ClassNotFoundException(ie.toString()); } } }

?

4.實現(xiàn)文件監(jiān)聽類

      
        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) {
        
     //文件改變處理函數(shù) 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();

                //設(shè)置新線程的類加載器

                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>
    
      ();
      
在監(jiān)聽到文件改變后,依據(jù)類名重new一個類加載器,用于加載類。
    
       ClassLoader classLoader = CCFileListener.claMap.get("Servlet.class"
      
        );
        
    if(classLoader==null
    
      ){

   classLoader =
      
         defaultCl; }
      
    
  
     首先獲取類名對應(yīng)的加載器,如果沒有使用默認的加載器
    

    
       ClassLoader classLoader = this
      
        .getContextClassLoader(); Class clazz = classLoader.loadClass("Servlet"
        
          ); Method service = clazz.getMethod("service", null
          
            ); service.invoke(clazz.newInstance(), null
            
              );
              
在線程內(nèi)部使用剛才在外部設(shè)置的線程上下文加載器加載新的Servlet,并執(zhí)行

學(xué)習(xí)Tomcat動態(tài)加載JSP的Class類

學(xué)習(xí)Tomcat動態(tài)加載JSP的Class類


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯(lián)系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發(fā)表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 福利免费在线 | 久久69精品久久久久久久电影好 | 欧美成年黄网站色视频 | 精品一区二区电影 | 成年网站免费观看 | 亚洲第一av | 午夜影院在线视频 | 国产成人最新毛片基地 | 成年网址网站在线观看 | 99精品在线观看 | 五月丁香综合啪啪成人小说 | 一级毛片免费观看不卡视频 | 一级做a爰片欧美一区 | 久久久久在线 | 国产成人18黄网站免费网站 | 亚洲欧美第一页 | 日本三级不卡 | 日韩精品一级毛片 | 久久se精品一区二区国产 | 91精品天美精东蜜桃传媒免费 | 国产成人精品视频免费 | 天天操天天插 | 免费A片线观看成人在-杏TV | 欧美性免费视频 | 成人亚洲一区 | 国产精品无码人妻系列AV | 国产福利99 | 日本在线观看高清不卡免v 国产成人一区二区精品非洲 | 欧洲另类一二三四区 | 粉嫩粉嫩芽的虎白女18在线视频 | 欧美精品一区二区精品久久 | 国产福利一区二区 | 国产一区二区三区在线 | 亚欧免费视频一区二区三区 | 国产深夜福利在线观看网站 | 天天干天天碰 | 精品AV一区二区三区久久 | 免费国产视频在线观看 | 久久人人爱 | 性开放的欧美大片按摩 | 色偷偷偷 |