我有一个自定义类加载器实现,其目的是使用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提供的类加载器使用自定义类并将结果作为新的默认类加载器使用?