微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

java – 实现过滤类加载器

我们正在扩展我们的 java应用程序以支持插件.其中一部分包括保持插件与我们自己的类隔离,因此每个插件都将存在于它自己的类加载器中.

我们还计划为插件提供一个java框架来使用,因此它必须暴露给插件.这个java框架还包含需要从我们自己的java代码访问的类,因此它也必须可以访问我们自己的java代码.

问题是如果java框架存在于系统类加载器(我们自己的java代码存在)中,我们就无法为插件提供我们想要的隔离.如果我们选择将java框架分离到不同的类加载器并使用它作为插件类加载器的父类,那么我们自己的类将无法看到java框架.

我想到的当前解决方案是实现过滤类加载器. java框架将存在于系统类加载器中,但是这个类加载器将过滤掉系统类加载器中的所有东西,除了java框架,我将使用这个类加载器作为插件父类加载器.

这是一个粗略的实现:

public class FilteringClassLoader extends ClassLoader {
    private urlclassloader _internalLoader;

    public FilteringClassLoader(ClassLoader parent) {
        super(parent);

        // load our java framework to this class loader
        _internalLoader = new urlclassloader(...)
    }

    public Class<?> loadClass(String name) throws ClassNotFoundException {
        // first,try to load from our internal class loader
        // that only sees the java framework if that works,load the class 
        // from the system class loader and return that. otherwise,the class 
        // should be filtered out and the call to loadClass will throw as expected
        _internalLoader.loadClass(name);

        Class<?> retClazz = super.loadClass(name);

        return retClazz;
    }
}

但是,我看到它有几个问题:

>仅使用单独的urlclassloader来查看是否应该过滤类感觉就像是对我的黑客攻击.
>当一个插件加载一个类时,该类父类加载器将是系统类加载器,这显然违背了我想要实现的目的的全部目的.

你是如何解决这类问题的?

解决方法

How do you solve this kind of problem?

Osgi联盟已经做到了.关于OSGi framework的维基百科文章可能会给你一些想法.

您可能希望查看Eclipse的源代码,并了解它们如何实现插件加载.

原文地址:https://www.jb51.cc/java/128500.html

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

相关推荐