2010-09-16 3 views
3

Я хочу создать экземпляр двух приложений TCP-сервера одним и тем же основным методом. Эти серверные классы используют множество статических и потоковых локальных полей. Есть ли возможность загружать классы, как в другом домене приложения?using classloader для изоляции двух статических классов

это мой тест:

Tester класс имеет простые методы получения и установки для установки глобального статического объекта.

public class Tester { 

    public Tester() { 
    System.out.println(getClass().getClassLoader()); 
    } 

    public void setText(String text) { 
    GlobalObject.globalText = text; 
    } 

    public String getText() { 
    return GlobalObject.globalText; 
    } 
} 

Это глобальный объект, доступный из любого места. Я хочу ограничить доступ к этому объекту.

public class GlobalObject { 

    public static String globalText; 
} 

Это моя тестовая программа.

public class Main { 
    public static void main(String[] args) { 
    // Default class loader; 
    Tester ta1 = new Tester(); 
    ta1.setText("test"); 
    System.out.println(ta1.getText()); 

    Tester ta2 = new Tester(); 
    System.out.println(ta2.getText()); 

    // Custom class loader; 
    CustomClassLoader ccl = new CustomClassLoader(); 

    try { 
     Tester tb = (Tester) ccl.loadClass("Tester").newInstance(); 
     System.out.println(tb.getText()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } 
} 

выводе является:

[email protected] 
test 
[email protected] 
test 
[email protected] 
test 

Выходной сигнал, что я хочу:

[email protected] 
test 
[email protected] 
test 
[email protected] 
null 
+0

Я не могу предложить достаточно сильно, чтобы вы отказались от изменчивой статики и местных жителей в пользу хорошо написанного кода! [добавить один десятый на свой вкус] –

ответ

3

Вы не говорите нам, что CustomClassLoader есть.

Но в целом поведение загрузчиков классов по умолчанию заключается в деле делегировании их родителям, поэтому по умолчанию все загрузчики классов в конечном итоге делегируют фактический загрузчик системного класса.

Попробуйте создать загрузчик классов без родителя. Так будет выглядеть со стандартным загрузчиком классов:

URL[] urls = new URL[] {new File("build/classes/").toURL()}; 
ClassLoader loader = new URLClassLoader(urls, null); 

Второй конструктор - это родительский.

+0

Я использовал этот: http://www.javalobby.org/java/forums/t18345.html, а также тот: http://www.xinotes.org/notes/note/ 444/ –

+0

@Firat, затем попробуйте изменить его конструктор, чтобы передать 'null' в' super' вместо 'CustomClassLoader.class.getClassLoader()'. –

+0

Передача null в супер не сработала, но UrlClassLoader работал. Большое спасибо. –

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