Java 如何将自定义类加载器设置为默认值?

Java 如何将自定义类加载器设置为默认值?,java,tomcat,classloader,Java,Tomcat,Classloader,我正在尝试使用自定义类装入器来练习自己,我有一些问题。是否有方法指示JVM全局使用我的自定义类加载器?例如,我编写了在Tomcat6下运行的小应用程序。servlet由容器管理,我应该在哪里设置类装入器?此外,webapp使用了一些第三方jar,我可以控制这些jar的类加载吗 对于独立应用程序,上述问题的答案是否会有所不同 谢谢 您可以将系统默认类加载器设置为JVM参数: java -Djava.system.class.loader =com.test.YourCustomClassL

我正在尝试使用自定义类装入器来练习自己,我有一些问题。是否有方法指示JVM全局使用我的自定义类加载器?例如,我编写了在Tomcat6下运行的小应用程序。servlet由容器管理,我应该在哪里设置类装入器?此外,webapp使用了一些第三方jar,我可以控制这些jar的类加载吗

对于独立应用程序,上述问题的答案是否会有所不同


谢谢

您可以将系统默认类加载器设置为JVM参数:

java -Djava.system.class.loader
    =com.test.YourCustomClassLoader com.test.YourMainClass
由于Tomcat作为java应用程序启动,您也可以在
%Tomcat\u HOME%\bin\run.bat
$Tomcat\u HOME/bin/run.sh
可执行文件中设置此参数

编辑以完成: 如果将类加载器设置为de系统类加载器,它将用于加载Tomcat组件类、不同的库和您自己的类。 如果希望类加载器仅用于应用程序类(包括库等),则应为上下文配置
loader
元素。 Loader元素必须在
上下文
元素中定义,它可以在
Context.xml
文件中定义。 更多信息:

  • :定义类加载器在Tomcat中的工作方式
  • :如何定义
    上下文
    元素
  • :如何为自己的
    上下文定义自定义
    加载程序
    元素

出于某种原因,它让我得到了java.lang.Error:java.lang.IllegalStateException:recursive调用。这就是我所做的:对类加载器进行子类化,提供以类加载器为参数的c'tor,使用-Djava.system.class.loader对其进行配置,然后。。。繁荣在VM初始化过程中出错:-(我错过了什么吗?我已经用我的一个小主应用程序对它进行了测试,它运行在OK.package com.demo.presale;公共类MyClassLoader扩展了ClassLoader{public MyClassLoader(ClassLoader parent){}受保护的类loadClass(字符串名称,布尔解析)抛出ClassNotFoundException{Class c=super.loadClass(name,resolve);System.out.println(“name:+name+”,Class:+c);返回c;}}}和异常:java.lang.IllegalStateException:java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1312)的递归调用位于java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1295)的java.lang.ClassLoader.(ClassLoader.java:228)的com.demo.presale.MyClassLoader.(MyClassLoader.java:7)的sun.reflect.NativeConstructorAccessorImpl.newInstance0(本机方法)在我的测试代码中,重写的构造函数调用父类构造函数。它检查一些权限,并将“initialized”属性设置为true。我还重写了默认构造函数,也调用了父类构造函数:package com.test;公共类MyCustomClassLoader扩展类加载器{public MyCustomClassLoader(){super();}public MyCustomClassLoader(ClassLoader父级){super(父级);}/*其余代码与您的代码完全相同*/}