tomcat自定义类加载器_开发者不可以自定义类加载器

tomcat自定义类加载器_开发者不可以自定义类加载器tomcat自定义类加载器

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺


tomcat 自定义类加载器

                      

                    

***************

相关类与接口

                 

WebappClassLoader

public class WebappClassLoader extends WebappClassLoaderBase {
    public WebappClassLoader() {
    }

    public WebappClassLoader(ClassLoader parent) {
        super(parent);
    }

    public WebappClassLoader copyWithoutTransformers() {
        WebappClassLoader result = new WebappClassLoader(this.getParent());
        super.copyStateWithoutTransformers(result);

        try {
            result.start();
            return result;
        } catch (LifecycleException var3) {
            throw new IllegalStateException(var3);
        }
    }

    protected Object getClassLoadingLock(String className) {
        return this;
    }
}

                  

WebappClassLoaderBase

public abstract class WebappClassLoaderBase extends URLClassLoader implements Lifecycle, InstrumentableClassLoader, WebappProperties, PermissionCheck {

    ...

    public Class<?> findClass(String name) throws ClassNotFoundException {
        if (log.isDebugEnabled()) {
            log.debug("    findClass(" + name + ")");
        }

        this.checkStateForClassLoading(name);
        if (this.securityManager != null) {
            int i = name.lastIndexOf(46);
            if (i >= 0) {
                try {
                    if (log.isTraceEnabled()) {
                        log.trace("      securityManager.checkPackageDefinition");
                    }

                    this.securityManager.checkPackageDefinition(name.substring(0, i));
                } catch (Exception var8) {
                    if (log.isTraceEnabled()) {
                        log.trace("      -->Exception-->ClassNotFoundException", var8);
                    }

                    throw new ClassNotFoundException(name, var8);
                }
            }
        }

        Class clazz = null;

        try {
            if (log.isTraceEnabled()) {
                log.trace("      findClassInternal(" + name + ")");
            }

            try {
                if (this.securityManager != null) {
                    PrivilegedAction<Class<?>> dp = new WebappClassLoaderBase.PrivilegedFindClassByName(name);
                    clazz = (Class)AccessController.doPrivileged(dp);
                } else {
                    clazz = this.findClassInternal(name);  //web类加载器先加载类
                }
            } catch (AccessControlException var4) {
                log.warn(sm.getString("webappClassLoader.securityException", new Object[]{name, var4.getMessage()}), var4);
                throw new ClassNotFoundException(name, var4);
            } catch (RuntimeException var5) {
                if (log.isTraceEnabled()) {
                    log.trace("      -->RuntimeException Rethrown", var5);
                }

                throw var5;
            }

            if (clazz == null && this.hasExternalRepositories) {
                try {
                    clazz = super.findClass(name);    //查找不到,调用父类加载器加载类
                } catch (AccessControlException var6) {
                    log.warn(sm.getString("webappClassLoader.securityException", new Object[]{name, var6.getMessage()}), var6);
                    throw new ClassNotFoundException(name, var6);
                } catch (RuntimeException var7) {
                    if (log.isTraceEnabled()) {
                        log.trace("      -->RuntimeException Rethrown", var7);
                    }

                    throw var7;
                }
            }

            if (clazz == null) {
                if (log.isDebugEnabled()) {
                    log.debug("    --> Returning ClassNotFoundException");
                }

                throw new ClassNotFoundException(name);
            }
        } catch (ClassNotFoundException var9) {
            if (log.isTraceEnabled()) {
                log.trace("    --> Passing on ClassNotFoundException");
            }

            throw var9;
        }

        if (log.isTraceEnabled()) {
            log.debug("      Returning class " + clazz);
        }

        if (log.isTraceEnabled()) {
            ClassLoader cl;
            if (Globals.IS_SECURITY_ENABLED) {
                cl = (ClassLoader)AccessController.doPrivileged(new WebappClassLoaderBase.PrivilegedGetClassLoader(clazz));
            } else {
                cl = clazz.getClassLoader();
            }

            log.debug("      Loaded by " + cl.toString());
        }

        return clazz;
    }


    protected Class<?> findClassInternal(String name) {
        this.checkStateForResourceLoading(name);
        if (name == null) {
            return null;
        } else {
            String path = this.binaryNameToPath(name, true);
            ResourceEntry entry = (ResourceEntry)this.resourceEntries.get(path);
            WebResource resource = null;
            if (entry == null) {
                resource = this.resources.getClassLoaderResource(path);
                if (!resource.exists()) {
                    return null;
                }

                entry = new ResourceEntry();
                entry.lastModified = resource.getLastModified();
                synchronized(this.resourceEntries) {
                    ResourceEntry entry2 = (ResourceEntry)this.resourceEntries.get(path);
                    if (entry2 == null) {
                        this.resourceEntries.put(path, entry);
                    } else {
                        entry = entry2;
                    }
                }
            }

            Class<?> clazz = entry.loadedClass;
            if (clazz != null) {
                return clazz;
            } else {
                synchronized(JreCompat.isGraalAvailable() ? this : this.getClassLoadingLock(name)) {
                    clazz = entry.loadedClass;
                    if (clazz != null) {
                        return clazz;
                    } else {
                        if (resource == null) {
                            resource = this.resources.getClassLoaderResource(path);
                        }

                        if (!resource.exists()) {
                            return null;
                        } else {
                            byte[] binaryContent = resource.getContent();
                            if (binaryContent == null) {
                                return null;
                            } else {
                                Manifest manifest = resource.getManifest();
                                URL codeBase = resource.getCodeBase();
                                Certificate[] certificates = resource.getCertificates();
                                String packageName;
                                if (this.transformers.size() > 0) {
                                    packageName = path.substring(1, path.length() - ".class".length());
                                    Iterator var12 = this.transformers.iterator();

                                    while(var12.hasNext()) {
                                        ClassFileTransformer transformer = (ClassFileTransformer)var12.next();

                                        try {
                                            byte[] transformed = transformer.transform(this, packageName, (Class)null, (ProtectionDomain)null, binaryContent);
                                            if (transformed != null) {
                                                binaryContent = transformed;
                                            }
                                        } catch (IllegalClassFormatException var18) {
                                            log.error(sm.getString("webappClassLoader.transformError", new Object[]{name}), var18);
                                            return null;
                                        }
                                    }
                                }

                                packageName = null;
                                int pos = name.lastIndexOf(46);
                                if (pos != -1) {
                                    packageName = name.substring(0, pos);
                                }

                                Package pkg = null;
                                if (packageName != null) {
                                    pkg = this.getPackage(packageName);
                                    if (pkg == null) {
                                        try {
                                            if (manifest == null) {
                                                this.definePackage(packageName, (String)null, (String)null, (String)null, (String)null, (String)null, (String)null, (URL)null);
                                            } else {
                                                this.definePackage(packageName, manifest, codeBase);
                                            }
                                        } catch (IllegalArgumentException var17) {
                                        }

                                        pkg = this.getPackage(packageName);
                                    }
                                }

                                if (this.securityManager != null && pkg != null) {
                                    boolean sealCheck = true;
                                    if (pkg.isSealed()) {
                                        sealCheck = pkg.isSealed(codeBase);
                                    } else {
                                        sealCheck = manifest == null || !this.isPackageSealed(packageName, manifest);
                                    }

                                    if (!sealCheck) {
                                        throw new SecurityException("Sealing violation loading " + name + " : Package " + packageName + " is sealed.");
                                    }
                                }

                                try {
                                    clazz = this.defineClass(name, binaryContent, 0, binaryContent.length, new CodeSource(codeBase, certificates));
                                } catch (UnsupportedClassVersionError var16) {
                                    throw new UnsupportedClassVersionError(var16.getLocalizedMessage() + " " + sm.getString("webappClassLoader.wrongVersion", new Object[]{name}));
                                }

                                entry.loadedClass = clazz;
                                return clazz;
                            }
                        }
                    }
                }
            }
        }
    }

    public void start() throws LifecycleException {
        this.state = LifecycleState.STARTING_PREP;
        WebResource[] classesResources = this.resources.getResources("/WEB-INF/classes");
                                         //加载的resource资源路径
        WebResource[] jars = classesResources;
        int var3 = classesResources.length;

        int var4;
        for(var4 = 0; var4 < var3; ++var4) {
            WebResource classes = jars[var4];
            if (classes.isDirectory() && classes.canRead()) {
                this.localRepositories.add(classes.getURL());
            }
        }

        jars = this.resources.listResources("/WEB-INF/lib");
                                         //加载的jar包资源路径
        WebResource[] var7 = jars;
        var4 = jars.length;

        for(int var8 = 0; var8 < var4; ++var8) {
            WebResource jar = var7[var8];
            if (jar.getName().endsWith(".jar") && jar.isFile() && jar.canRead()) {
                this.localRepositories.add(jar.getURL());
                this.jarModificationTimes.put(jar.getName(), jar.getLastModified());
            }
        }

        this.state = LifecycleState.STARTED;
    }

    ...

                 

                

***************

自定义类加载器

             

@Data
class Person{

    private String name;
    private Integer age;
}

class CustomLoader extends ClassLoader{

    private String loadPath;
    private final String loaderName = "customLoader";

    public CustomLoader(String loadPath){
        this.loadPath = loadPath;
    }

    public CustomLoader(ClassLoader parent, String loadPath){
        super(parent);
        this.loadPath = loadPath;
    }

    @Override
    protected Class<?> findClass(String name) throws ClassNotFoundException {
        try {
            byte[] data = getClassData(name);
            return defineClass(name, getClassData(name),0, data.length);
        }catch (Exception e){
            throw new ClassNotFoundException();
        }
    }

    private byte[] getClassData(String name) throws Exception{
        String path;
        String suffix = ".class";

        int index = name.lastIndexOf(".");
        name = name.substring(index+1);
        if (loadPath.endsWith("/")){
            path = loadPath + name + suffix;
        }else {
            path = loadPath + File.separator + name + suffix;
        }

        FileInputStream inputStream =  new FileInputStream(path);
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

        try {
            byte[] data = new byte[1024];
            int size = 0;
            while ((size = inputStream.read(data))!=-1){
                outputStream.write(data, 0, size);
            }

            return outputStream.toByteArray();
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            try {
                inputStream.close();
                outputStream.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }

        throw new ClassNotFoundException();
    }

    @Override
    public String toString() {
        return "CustomLoader{" +
                "loaderName='" + loaderName + '\'' +
                '}';
    }
}

public class LoaderTest {

    private static final String loadPath = "./custom";

    public static void main(String[] args) throws Exception{
        CustomLoader customLoader = new CustomLoader(null, loadPath);
        fun(customLoader, "com.example.demo.test.Person");

        CustomLoader customLoader2 = new CustomLoader(loadPath);
        fun2(customLoader2, "com.example.demo.test.Person");
    }

    private static void fun(CustomLoader customLoader, String className) throws Exception{
        Class<?> person = customLoader.loadClass(className);
        System.out.println("customLoader.loadClass(className):"+person.getClassLoader());

        System.out.println("Person.class.getClassLoader():"+Person.class.getClassLoader()+"\n");
    }

    private static void fun2(CustomLoader customLoader, String className) throws Exception{
        Class<?> person = customLoader.loadClass(className);
        System.out.println("customLoader.loadClass(className):"+person.getClassLoader());

        System.out.println("Person.class.getClassLoader():"+Person.class.getClassLoader());

        Person object = (Person)person.getConstructor().newInstance();
        Method name = person.getDeclaredMethod("setName", String.class);
        name.invoke(object,"瓜田李下");
        Method age = person.getDeclaredMethod("setAge", Integer.class);
        age.invoke(object, 20);

        System.out.println(object);
    }
}

                      

控制台输出

customLoader.loadClass(className):CustomLoader{loaderName='customLoader'}
Person.class.getClassLoader():sun.misc.Launcher$AppClassLoader@18b4aac2

customLoader.loadClass(className):sun.misc.Launcher$AppClassLoader@18b4aac2
Person.class.getClassLoader():sun.misc.Launcher$AppClassLoader@18b4aac2
Person(name=瓜田李下, age=20)

              

             

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196931.html原文链接:https://javaforall.net

(0)
上一篇 2025年9月17日 上午11:22
下一篇 2025年9月17日 下午12:01


相关推荐

  • 面试官都震惊,你这网络基础可以啊![通俗易懂]

    面试官都震惊,你这网络基础可以啊![通俗易懂]目录网络1.对网络的基础认识<1>.组网方式<2>.OSI七层模型<3>.TCP/IP五层(四层模型)<4>.对封装分用的理解2.网络数据传输<1>局域网(1)认识IP和MAC(2)网络数据传输的特性(3)网络数据传输流程1)网络互联的方式2).局域网交换机组网的方式3)局域网交换机+路由器组网的方式<2>广域网传输流程3.UDP和TCP<1>UDP协议<2>TCP协议(可靠的传输协议)(1)TCP相关概念(2)

    2022年4月20日
    422
  • 什么是多层感知机(什么是多层感知机)

    1.感知机与多层感知机1.1门与门:实现逻辑“乘”运算y=AB与门真值表ABy000010100111非门:实现逻辑非,一对一输出非门真值表Ay0110或门:实现逻辑“和”运算y=A+B或门真值表ABy00010101111…

    2022年4月11日
    104
  • linux 创建文件命令总结

    linux 创建文件命令总结1 vivi1 txt 会直接创建并打开一个文件 1 txt2 touchtouch 的作用是更改一个文件或目录的时间 touch2 txt 如果 2 txt 不存在 则创建空文件 2 txt3 echo nbsp echo abcd 3 txt 可以直接创建文件 3 txt 并将 abcd 写入 4 less more cat nbsp 三者都是将文件内容输出到标准输出 其中 less 和 mo

    2026年3月18日
    3
  • CORBA简介_吴帝聪简介

    CORBA简介_吴帝聪简介 1.CORBA:CommonObjectRequestBrokerArchitecture,通用对象请求代理体系。是由对象管理组(ObjectManagementGroup,OMG)制定的一种标准的面向对象分布式应用程序体系规范,旨在为异构分布式环境中,硬件和软件系统的互联而提出的一种解决方案。2.解决异构分布式系统两条主要原则:(1).寻求独立于平台的模型和抽象,这

    2022年4月19日
    53
  • window.location.href和window.location.hash的区别

    window.location.href和window.location.hash的区别综:window.location.href表示重定向,后面跟着的是完整的url地址,与其相似的还有window.location.hash,下面来比较window.location.href和window.locaiton.hash的区别。    (1)window.location.href        得到和使用的是完整的url,比如window.

    2022年7月16日
    23
  • python解析jmeter.jtl文件_jmeter jtl文件解析

    python解析jmeter.jtl文件_jmeter jtl文件解析Jmeter 报告生成 1 第一种在测试过程中直接用命令生成图标在测试过程中将 jtl 转成测试报告 在 jmeter 的 bin 目录下执行 jmeter n tbaidu requests results jmx r lbaidu requests results jtl e o home tester apache jmeter 3 0 resultReport 参数说明 n 非

    2026年3月16日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号