欧美三区_成人在线免费观看视频_欧美极品少妇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條評論
主站蜘蛛池模板: 国产欧美一区二区三区精品 | 欧美一区二区三区免费视频 | 色爱综合区五月小说 | 天天综合亚洲 | 精品欧美日韩 | 欧美一区二区三区久久久 | 亚洲激情成人 | 欧美在线一区二区三区 | 色精品 | 青草青在线 | 91亚洲一区 | 日韩男女做性高清在线观看 | 狠狠干91| 国产精品婷婷 | 波多野结衣中文在线播放 | 国产伦理一区二区三区 | 国产亚洲精品精品国产亚洲综合 | 午夜寂寞在线观看 | 香港三级大全 | 二级黄的全免费视频 | 一级片在线观看 | 黄色片免费看网站 | 国产成人免费无庶挡视频 | 日本无码少妇波多野结衣 | 欧美国产视频 | 夜干夜干2017最新网站 | 一区二区三区四区在线 | 成人免费电影av | 龙珠z在线观看 | 欧美中文在线观看 | 一区二区三区中文字幕 | 国产午夜精品一区二区三区嫩草 | 精品成人免费 | av网址在线播放 | 污网站在线免费看 | 久久机热 | 久久精品视频99 | 男女视频在线 | 国产亚洲精品久久一区二区三区 | 精品视频一区二区三区在线观看 | 亚洲毛片大全 |