我想从字节数组中加载Tomcat中的新类(以前没有加载过)。我也参考了tomcat应用程序类加载器。 我将自定义类加载器声明为
class CustomClassLoader extends ClassLoader{
public CustomClassLoader(ClassLoader classLoader) {
super(classLoader);
}
public Class loadThisClass(String name){
//get .class byte array in data.
Class clazz = defineClass(name, data, 0, data.length, null);
resolveClass(clazz);
return clazz;
}
}
我正在使用这个类加载器
CustomClassLoader customClassLoader = new CustomClassLoader(getClass().getClassLoader());
/*
print getClass().getClassLoader() and it output as
WebappClassLoader
context: /test
delegate: false
repositories:
/WEB-INF/classes/
----------> Parent Classloader:
org.apache.catalina.loader.StandardClassLoader@52e99642
*/
Class clazz = customClassLoader.loadThisClass("com.Class1");
//print clazz.getMethods, it print my new method.
当我尝试按如下方式检查此课程时
Class.forName("com.Class1");
我收到了ClassNotFoundException,Web应用程序中的其他类无法访问此类。
如何在我的Web应用程序中的其他类可以访问的tomcat Web应用程序中定义新类。。
答案 0 :(得分:0)
这可能还不够,但您不需要覆盖Classloader中的findClass
吗?
protected class findClass(String name) 抛出ClassNotFoundException
查找具有指定二进制名称的类。应该覆盖此方法 遵循委托模型的类加载器实现 加载类,之后将由loadClass方法调用 检查所请求类的父类加载器。 默认值 实现抛出ClassNotFoundException。
Prohibited package name : java.lang
意味着您尝试从您自己的类加载器中加载java.lang的包空间中的类。是您尝试在java.lang包中加载的类加载器还是类?
如果不是你的类加载器可能试图加载太多。在你的findClass重写中,你应该检查它是否在你的域中,如果没有则抛出。
protected Class<?> findClass(String name) {
if(!name.startsWith("com.your.package")) throw new ClassNotFoundException();
}