在Tomcat中定义新类

时间:2014-10-23 03:36:48

标签: java tomcat tomcat7 classloader

我想从字节数组中加载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应用程序中定义新类。

1 个答案:

答案 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();
} 
相关问题