2013-05-10 24 views
1

我想在JVM启动时加载额外的类。具体来说,应该在加载所有核心库之后加载类(至少在rt.jarlib/ext之后)。Java - 在JVM启动时加载额外的类

该类未被引用。它包含一个静态块,用于设置JVM范围的代理,我们希望所有的URL连接都可以使用。

我试过了-Xbootclasspath/a,-Xbootclasspath/p选项。随着-verbose:class被添加到JVM_OPTS以及由-Xbootclasspath变体创建的加载/打开输出表明所有核心库都被“加载”,而我的JAR只是“打开”。

在所有核心类加载完毕后,是否有强制加载类的方法 - 或者还是更好地加载JAR中的所有类?

回答

0

经过研究,我找不到比定制类加载器更好的方法。

这是我写的。它固有地为所有的类加载方法使用默认的类加载器,但是提供对可以发生自定义的类加载/引用的非静态初始化器的访问。

public class CustomClassLoader extends ClassLoader { 

    { 
     // Custom class loading goes in this non-static initializer. 
     loadClass("java.org.myorganisation.package.MyClass"); 
    } 

    public CustomClassLoader() { 
     super(CustomClassLoader.class.getClassLoader()); 
    } 

    public CustomClassLoader(ClassLoader parent) { 
     super(parent); 
    } 
} 

通过定义系统属性-Djava.system.class.loader=com.anon.mypackage.CustomClassLoader指定自定义类加载器。

+0

在你的回答中,当你写下“自定义类加载进入这个静态块。”你的意思是你只是引用静态类来加载?还是你做了其他事情?既然现在你提出这个解决方案已经两年了,你有没有找到更好的方法来做到这一点? – 2015-05-16 15:07:24

+0

@AndrewBate我修改了我的描述(这是错误的)和代码,虽然我现在无法测试,所以请告诉我,如果你这样做。正如你所提到的,我很久以前就为一个特定的用例写了这篇文章,并且从那以后没有重新尝试相同的目标,所以没有更好的选择建议。我甚至不知道非静态初始化是必要的,我原以为你可以简单地在构造函数中调用'loadClass' ......但是再一次,我希望以很好的理由解决这个问题:) – KomodoDave 2015-05-18 07:53:12