亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

學習Tomcat動態加載JSP的Class類

系統 1812 0

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

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

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

1.定義服務類

      
        public
      
      
        class
      
      
         Servlet {



    
      
      
        public
      
      
        void
      
      
         service(){

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

    }

    

}
      
    

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,并執行

學習Tomcat動態加載JSP的Class類

學習Tomcat動態加載JSP的Class類


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

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

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 黄页在线免费观看 | 在线观看欧美精品 | 亚久久| 国产成人高清精品免费观看 | 久久精品免费观看久久 | 亚洲国产成人综合 | 欧美成人在线视频 | 久久久久夜 | 国产日韩三级 | 国产精品深夜福利免费观看 | 日韩天天摸天天澡天天爽视频 | 成在线人免费视频一区二区三区 | 99久久99视频 | 老司机午夜精品视频在线观看免费 | 四小虎免费永久观看 | 久久性生活片 | 久草在线中文最新视频 | 美女被草视频 | 色综合天天色综合 | 精品无人区乱码1区2区3区在线 | 麻豆久久精品 | 精品国产一区二区三区四区不 | 欧美日韩视频在线第一区 | 涩涩伊人 | 亚洲综合综合在线 | 最新国产精品精品视频 | 淫视频网站 | 好吊色青青青国产欧美日韩 | 四虎影视在线麻豆国产 | 奇米影视第四色在线 | 国产精品亚洲欧美日韩区 | 亚洲无卡视频 | 国内精品免费视频 | 成人老司机深夜福利久久 | 色综合影视 | 一级毛片在线观看视频 | 欧美毛片一级 | 亚州免费一级毛片 | 色偷偷成人网免费视频男人的天堂 | 5060网一级毛片免费观看 | 天天操狠狠操 |