tomcat 5.5 动态加载类

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了tomcat 5.5 动态加载类相关的知识,希望对你有一定的参考价值。

转载于:http://www.itxuexiwang.com/a/javadianzishu/tomcat/2016/0225/161.html?1456480735

开发使用的是tomcat5.5.27,对于WEB-INF/classes下面的类做了修改,tomcat就会就会自动重启,然后紧接着就是内存溢出。调试比较麻烦。昨天研究了一下tomcat的源代码,对类的加载机制作了一点点修改,让它动态加载类,这样调试的时候如果修改了java文件就不用重启 tomcat了。具体步骤如下:

修改WebappClassLoader.java文件中的modify()方法,
在745行的
    return (true);注销,修改为:
    // return (true);
    //做了修改,重新装载
    this.reloadresource(i);
    return false;

然后添加一个对方法reloadresource的实现:
    /**
     * 重新装载的动作包括:
     * 1。重新装载
     * 2。更新最新时间
     * @param i
     */
    private void reloadresource(int i)throws NamingException{
        String path = paths[i];
        String tclassName = path.replaceAll(this.repositories[0], "");
        String name = tclassName.replaceAll("/", ".").replaceAll(".class", "");
        
        resourceEntries.remove(name);
        this.findResourceInternal(name, tclassName); 
        System.out.println("重新加载了类文件:"+tclassName);
        long lastModified =
            ((ResourceAttributes) resources.getAttributes(path))
            .getLastModified();
        lastModifiedDates[i] = lastModified;
        
        //从这里加载的相当于多在paths和lastModifiedDates中多添加了冗余记录,需要删除最后一个
        synchronized (allPermission) {
            int j;
            long[] result2 = 
                new long[lastModifiedDates.length - 1];
            for (j = 0; j < (lastModifiedDates.length - 1); j++) {
                result2[j] = lastModifiedDates[j];
                }
            lastModifiedDates = result2;

            String[] result = new String[paths.length - 1];
            for (j = 0; j < (paths.length - 1); j++) {
                result[j] = paths[j];
                }
            paths = result;

        }
    }
这样就可以动态的由tomcat来加载类了。

?

以上是关于tomcat 5.5 动态加载类的主要内容,如果未能解决你的问题,请参考以下文章

通过动态类加载解决通过Tomcat全局存储进行回显在Shiro中的Header过长问题

tomcat加载出错求教

在android中动态创建选项卡并使用传入的参数加载片段

tomcat没有绑定到此类加载器

Tomcat 5.5 中的 URL 路由和相对链接

Android 逆向类加载器 ClassLoader ( 类加载器源码简介 | BaseDexClassLoader | DexClassLoader | PathClassLoader )(代码片段