2013-05-10 6 views
1

Я хотел бы загрузить дополнительный класс при запуске JVM. В частности, класс должен быть загружен после загрузки всех основных библиотек (так что после rt.jar и lib/ext не менее).Java - загрузить дополнительный класс при запуске JVM

Класс нигде не указан. Он содержит статический блок, устанавливающий прокси-сервер JVM, который мы хотели бы использовать для всех URL-соединений.

Я пробовал опции -Xbootclasspath/a, -Xbootclasspath/p. С -verbose:class добавлено к JVM_OPTS, а выход нагрузки/открытия, созданный с помощью варианта -Xbootclasspath, указывает, что все основные библиотеки «загружены», а мой JAR просто «открыт».

Есть ли способ принудительно загрузить класс - или еще лучше все классы в JAR - при загрузке JVM после загрузки всех базовых классов?

ответ

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

В вашем ответе, когда вы написали «Загрузка пользовательского класса идет в этот статический блок». вы имели в виду, что вы просто ссылаетесь на статический класс, который нужно загрузить? Или ты сделал что-нибудь еще? Поскольку через два года после того, как вы придумали это решение, нашли ли вы лучший способ сделать это? –

+0

@AndrewBate Я изменил свое описание (что было неправильно) и код, хотя я не могу проверить его прямо сейчас, поэтому дайте мне знать, если вы это сделаете, пожалуйста. Как вы уже упоминали, я написал это давно для конкретного варианта использования, и с тех пор не повторил попытку с той же целью, поэтому у вас нет лучшей альтернативы. Я даже не знаю наверняка, что нестатический инициализатор необходим, я бы подумал, что вы могли бы просто вызвать 'loadClass' внутри конструктора ... но опять же, я надеюсь, что этот подход подходит по хорошей причине :) – KomodoDave

Смежные вопросы