Est-il possible que les utilisateurs de ma bibliothèque modulaire peuvent classes d'accès qui ne sont pas exportés?

Gjwtsly:

Je suis en train de se familiariser avec le système de module introduit en Java 9, et je voudrais savoir la meilleure façon de tirer parti de ce.

Pour une bibliothèque, je vous écris, je voudrais faire ce qui suit (ignorer la désignation des colis):

  • Qu'exposer interfaces, simples classes POJO, et les classes d'usine par com.myproject.api. Tout dans cette classe peut être utilisée par les utilisateurs.
  • Mettre la mise en œuvre des interfaces com.myproject.core. Les utilisateurs ne devraient pas être en mesure de quoi que ce soit d'accès ici.

Mon raisonnement est que les utilisateurs ne doivent pas se confondre ou dépassés par la logique de mise en œuvre. Au lieu de cela, ils peuvent tout simplement regarder (si tout va bien) interfaces propres et bien documentated.

Cependant, en raison de la façon dont fonctionnent les packages Java, il peut être difficile de restreindre l'utilisation de certaines classes sans leur faire forfait privé. Mais je ne aime pas mettre toutes les classes dans un seul paquet, et préfère les organiser en différents paquets.

Après avoir lu sur le système de module, je crois que je peux faire ce qui suit pour obtenir ce que je veux. Ceci est le module-info.javafichier:

module com.myproject {
    exports com.myproject.api;
}  

De ma compréhension, les utilisateurs de ma bibliothèque seront en mesure d'utiliser tout défini dans le com.myproject.apipackage (en utilisant require com.mypojrect.apidans leur propre fichier module-info).

Mais est - il possible que les utilisateurs seront en mesure de quoi que ce soit d'accès dans le com.myproject.corepaquet? Je n'ai aucun problème avec eux regardant le code (via IDE ou le code source lui - même), mais je ne veux pas finir par soutenir les classes / méthodes / logique que je ne voulais pas exposer.

Je crains que les utilisateurs qui ne disposent pas d'une application modularisé ou les utilisateurs qui ont mis ma bibliothèque JAR sur le chemin de classe sera en quelque sorte de trouver un moyen d'avoir accès à l'ensemble supposé restreint.

S'il vous plaît laissez-moi savoir si vous avez besoin d'autres informations.

LppEdd:

Un pré - JDK9utilisateur de votre bibliothèque ne peut exister, que vous allez utiliser la plate - forme Java Module System , qui est post JDK8, et donc vous allez compiler une version de classe supérieure 52.

Dit que, vos utilisateurs seront en mesure de regarder le code source (si livré), et il est évident qu'ils seront en mesure d'extraire vos .classfichiers.


Par définition

un type dans un module n'est pas accessible à d'autres modules à moins que c'est un type public et vous exporter son emballage.

La seule façon de gagner réfléchissant l' accès à vos classes serait si vous volontairement ouvert eux, avec le

opens your.package

directif. Donc , en gros, vous êtes couvert aussi sur l' Reflectionaspect.
Et les opensexpose directive aux Reflectiondéfinitions publiques seulement.


Si vous souhaitez contrôler réfléchissant l' accès à vos classes dans un / pré non modulaire JDK9environnement, SecurityManager peut - être ce que vous cherchez. Cependant cela nécessite l' accès à la configuration machine virtuelle Java.

Je suppose que tu aimes

Origine http://43.154.161.224:23101/article/api/json?id=119150&siteId=1
conseillé
Classement