包装WildFly部署类加载器

时间:2018-04-19 10:56:58

标签: wildfly classloader

我有一个自定义类加载器实现,其目的是使用Javassist在运行时构建某些类。它唯一的覆盖方法在伪代码中看起来像这样:

@Override
protected Class <?> findClass (String name) throws ClassNotFoundException
{
    if (name.startsWith ("built.at.runtime."))
        return buildWithJavassistAndDefineClass (name);
    else
        return real_class_loader.findClass (name);
}

其中real_class_loader通常由WildFly提供,并使用Thread.currentThread().getContextClassLoader()检索。

这样可以正常工作,我可以打电话

Class.forName (..., new MyBuildingClassLoader ())

在运行时构建类。但问题是我需要明确指定类加载器。许多地方(其中一些我甚至无法控制)都不会这样做,因此找不到这样的运行时构建的类。

例如,我创建了built.at.runtime.Foo的实例(例如,在生成的类上使用newInstance()方法)。然后我序列化它。直到现在一切正常。但是当我尝试反序列化它时,我得到ClassNotFoundException: build.at.runtime.Foo,因为反序列化过程使用线程上下文类加载器, MyBuildingClassLoader

我知道有Thread.setContextClassLoader()方法,但如果可能的话,宁愿避免在每个下一个帖子中调用它。

问题:以某种方式可以&#34;包装&#34; WildFly提供的类加载器使用自定义类并将结果作为新的默认类加载器使用?

0 个答案:

没有答案