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

13

我正在尝试使用自定义类加载器进行练习,并且有一些问题。是否有办法指示JVM全局使用我的自定义类加载器?例如,我编写了一个在Tomcat 6下运行的小应用程序。 Servlet由容器管理,在哪里设置我的类加载器?此外,Web应用程序使用一些第三方JAR文件,我能控制这些库的类加载吗?

如果是独立应用程序,以上问题的答案是否会不同?

谢谢!

1个回答

15
你可以将系统默认的类加载器设置为JVM参数:
java -Djava.system.class.loader
    =com.test.YourCustomClassLoader com.test.YourMainClass

由于Tomcat是作为Java应用程序启动的,因此您可以在%TOMCAT_HOME%\bin\run.bat$TOMCAT_HOME/bin/run.sh可执行文件中设置此参数。

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


由于某些原因,我遇到了java.lang.Error: java.lang.IllegalStateException: recursive invocation的问题。这是我做的事情:子类化ClassLoader,提供一个以ClassLoader为参数的构造函数,使用-Djava.system.class.loader进行配置,然后...崩溃了!VM初始化期间发生错误 :-( 我错过了什么吗? - Seffy
我已经用一个小的主应用程序进行了测试,它运行良好。 - Tomas Narros
包 com.demo.presale;public class MyClassLoader extends ClassLoader { public MyClassLoader( ClassLoader parent ) { } protected Class loadClass( String name, boolean resolve ) throws ClassNotFoundException { Class c = super.loadClass( name, resolve ); System.out.println( "name: " + name + ", class: " + c); return c; } } - Seffy
异常信息:java.lang.IllegalStateException: 递归调用 at java.lang.ClassLoader.initSystemClassLoader(ClassLoader.java:1312) at java.lang.ClassLoader.getSystemClassLoader(ClassLoader.java:1295) at java.lang.ClassLoader.<init>(ClassLoader.java:228) at com.demo.presale.MyClassLoader.<init>(MyClassLoader.java:7) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) - Seffy
在我的测试代码中,重写的构造函数调用了父类的构造函数。它检查了一些权限,并将“initialized”属性设置为true。我还重写了默认构造函数,也调用了父构造函数:package com.test; public class MyCustomClassLoader extends ClassLoader { public MyCustomClassLoader() { super(); } public MyCustomClassLoader(ClassLoader parent) { super(parent); } /* 其余的代码与你的相同 */ } - Tomas Narros

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接