2011-04-15 5 views
4

Puis-je créer un package de mon choix portant le même nom qu'un package prédéfini
en Java, tel que java.lang?Puis-je créer un package java. * Personnalisé?

Si oui, quels seraient les résultats? Cela ne me permettrait-il pas d'accéder aux membres protégés de ce paquet? Sinon, qu'est-ce qui m'empêche de le faire?

Répondre

7

Non - java.lang est interdite. Le gestionnaire de sécurité n'autorise pas les classes "personnalisées" dans le package java.lang et il n'y a aucun moyen de lui dire de les accepter.

Vous avez raison - les classes propres déclarées dans l'espace de noms java.lang vous permettent d'utiliser les méthodes protected et les membres des classes de ce package, ce qui est définitivement inutile.


Cette compile très bien - mais - essayer de l'exécuter;)

package java.lang; 

public class EvilAsEvilCanBe { 

    public static void main(String[] args) { 
     System.out.println("hehe"); 
    } 

} 
+2

J'ai juste donné java.lang comme exemple de paquet? et vous avez dit que le responsable de la sécurité l'empêcherait. mais est-ce que cela signifie que je peux le faire par exemple avec un paquet tiers n'ayant pas de gestionnaire de sécurité ou de licence? –

+1

@AB Najjar - bien sûr - vous pouvez déclarer * vos * classes dans le même espace de noms (= paquet) que d'autres outils. Et puis vous pouvez utiliser * leurs * classes, méthodes et champs privés. Et * ils * peuvent utiliser le vôtre. ** Mais **: considérer cela comme techniquement possible et généralement une mauvaise pratique. Utilisez les autres bibliothèques de manière coopérative, généralement les gens savent * pourquoi * ils déclarent le paquetage privé. –

+0

et cela m'accorderait l'accès à ce paquet de membres protégés ?! n'est-ce pas gênant ou même mal? –

2

Il y a deux choses qui vous empêchent.

1) Le contrat de licence. "Remarque: Les applications qui utilisent cette option dans le but de remplacer une classe dans rt.jar ne doivent pas être déployées car cela contreviendrait à la licence de code binaire Java 2 Runtime Environment." http://download.oracle.com/javase/6/docs/technotes/tools/windows/java.html

2) Vous devez utiliser le -Xbootclasspath:bootclasspath ou ajouter un répertoire lib/endorsed.

Certaines classes ne sont pas facilement modifiées en raison d'optimisations internes dans la JVM, par ex. vous ne pouvez pas ajouter plus d'une méthode à Objet dans la JVM de Sun/Oracle;)

3

Tout nom de paquet correspondant à "java. *" est interdit et une exception de sécurité sera levée.