2010-09-16 8 views
3

Je veux instancier deux applications serveur TCP dans la même méthode principale. Ces classes de serveur utilisent beaucoup de champs locaux statiques et thread. Est-il possible de charger des classes comme dans un domaine d'application différent?en utilisant classloader pour isoler deux classes statiques

c'est mon cas de test:

classe testeur a getter simples et méthodes de réglage pour le réglage objet statique global.

public class Tester { 

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

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

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

C'est l'objet global qui est accessible depuis partout. Je veux limiter l'accès à cet objet.

public class GlobalObject { 

    public static String globalText; 
} 

Ceci est mon programme de test.

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(); 
    } 
    } 
} 

Le ouput est:

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

La sortie que je veux:

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

Je ne peux pas suggérer assez fortement que vous abandonniez la statique mutable et les threads locaux au profit d'un code bien écrit! [ajouter onze à votre goût] –

Répondre

3

Vous ne nous dites pas ce que CustomClassLoader est. Mais en général, le comportement par défaut des chargeurs de classes est de déléguer à leur parent, donc par défaut tous les chargeurs de classe délèguent finalement au chargeur de classe système réel. Essayez de créer un chargeur de classe sans parent. Voici à quoi cela ressemblerait avec un chargeur de classe standard:

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

Le deuxième paramètre du constructeur est le parent.

+0

j'ai utilisé celui-ci: http://www.javalobby.org/java/forums/t18345.html et aussi celui-là: http://www.xinotes.org/notes/note/ 444/ –

+0

@Firat, puis essayez de modifier son constructeur pour passer 'null' à' super' au lieu de 'CustomClassLoader.class.getClassLoader()'. –

+0

passant null à super ne fonctionne pas, mais UrlClassLoader a fonctionné. Merci beaucoup. –