Le langage Java a introduit un concept important dans sa version 9 : le module. Si vous êtes familier avec la gestion modulaire du code JavaScript, vous devriez vous sentir familier lorsque vous verrez la gestion modulaire de Java 9.
Module introduit un niveau supérieur de regroupement de code Java, similaire aux packages en Java. Chacun de ces groupes (modules) contient de nombreux sous-packages. Déclarez le dossier et ses sous-dossiers en tant que module en ajoutant le fichier module-info.java à la racine du package de fichiers de code source d'un module. La syntaxe du fichier est la suivante :
module xxx.yyy{ .... }
où xxx.yyy est le nom de la déclaration du module, pas le nom du package.
Le fichier module-info.java peut spécifier quels packages sous le module sont visibles et accessibles au monde extérieur. Cette fonction est implémentée via un nouveau mot-clé exports
. exports
来实现该功能。
module xxx.yyy{ exports com.zimug.java9; }
com.zimug.java9
代表一个package。
需要注意的是:即使给定package包中的类是public的,如果未通过’exports’显式导出其程序包,则它们在模块外部也是不可见的(在编译时和运行时都是如此)。
如果另一个模块想要使用被导出的package包中的类,可以用requires
关键字在其module-info.java文件中来导入(读取)目标模块的package包。
module def.stu{ requires xxx.yyy;}
笔者认为,Java 9引入module 模块化管理系统主要是出于对安全性的考虑。Java 代码中90%以上的漏洞都是由反射和访问权限控制粒度不足引起的,Java 9的模块化系统正好能解决这个问题。Java 9模块化提供了更高级别的Java代码可视性和可访问性控制。
作为示例,当我们将一个类标记为private时,意味着它是一个内部类。外部类只有两种修饰符:public和默认(default)。这也就意味着一个问题,有些public class我们本来是打算在jar包定义的范围内使用的,但是结果却是任何引入了这个jar的项目都可以使用这个jar里面所有的public class代码。
也就是我们的原意是在有限范围内提供公开访问,结果却是无限制的对外公开。在引入Java 9模块化之后,可以实现有限范围内的代码public访问权限,将代码公开区分为:模块外部有限范围的公开访问和模块内部的公开访问。
在此示例中,我将创建两个模块“ common.widget”和“ data.widget”,并将它们放置在单个文件夹“ modules-examples/src”下。文件“ module-info.java”将放置在每个模块的根文件夹下。
文件及目录格式如下:
D:\modules-example>tree /F /A \---src +---common.widget | | module-info.java | | | +---com | | \---zimug | | RendererSupport.java | | | \---org | \---jwidgets | SimpleRenderer.java | \---data.widget | module-info.java | \---com \---example Component.java
本代码文件目录:
modules-example/src/common.widget/org/jwidgets/SimpleRenderer.java。
这个package在后文中没有被exports。
package org.jwidgets; public class SimpleRenderer { public void renderAsString(Object object) { System.out.println(object); } }
本代码文件目录:
modules-example/src/common.widget/com/zimug/RendererSupport.java。
这个package在后文中被exports了。
package com.zimug; import org.jwidgets.SimpleRenderer; public class RendererSupport { public void render(Object object) { new SimpleRenderer().renderAsString(object); } }
模块导出,本代码文件目录:modules-example/src/common.widget/module-info.java。只导出com.zimug
包,没有导出 org.jwidgets
包。导出的模块名称为common.widget
module common.widget{ exports com.zimug; }
模块导入common.widget
,本代码文件目录:modules-example/src/data.widget/module-info.java
module data.widget { requires common.widget; }
使用导入模块common.widget
中的package:com.zimug
。本代码文件路径:
modules-example/src/data.widget/com/example/Component.java
package com.example; import com.zimug.RendererSupport; public class Component { public static void main(String[] args) { RendererSupport support = new RendererSupport(); support.render("Test Object"); } }
正常编译执行,结果如下:
Test Object
由于包“ org.jwidgets”尚未通过“ common.widget”模块导出,因此另一个模块“ data.widget”无法使用该package包下的类SimpleRenderer
package com.example; import org.jwidgets.SimpleRenderer; public class Component { public static void main(String[] args) { SimpleRenderer simpleRenderer = new SimpleRenderer(); simpleRenderer.renderAsString("Test Object"); } }
com.zimug.java9
représente un package. Remarque : Même si les classes d'un package donné sont publiques, si leur package n'est pas explicitement exporté via 'exports', elles ne sont pas visibles en dehors du module (au moment de la compilation et cela est vrai pendant l'exécution).3. Package d'importation de module🎜🎜Si un autre module souhaite utiliser les classes du package exporté, il peut utiliser le mot-clé
requires
dans son fichier module-info.java Pour importer ( read) le package package du module cible. 🎜D:\modules-example\src\data.widget\com\example\Component.java:3: error: package org.jwidgets is not visible import org.jwidgets.SimpleRenderer; ^ (package org.jwidgets is declared in module common.widget, which does not export it) 1 error
🎜modules-example/src/common.widget/org/jwidgets/SimpleRenderer .java. 🎜🎜Ce package n'est pas exporté dans l'article suivant. 🎜rrreee🎜Ce répertoire de fichiers de code : 🎜
🎜modules-example/src/common.widget/com/zimug/RendererSupport.java. 🎜🎜Ce package sera exporté ultérieurement. 🎜rrreee🎜Exportation du module, ce répertoire de fichiers de code : modules-example/src/common.widget/module-info.java. Seul le package
com.zimug
est exporté et le package org.jwidgets
n'est pas exporté. Le nom du module exporté est common.widget
🎜rrreeecommon.widget
, ce répertoire de fichier de code : modules-example / src/data.widget/module-info.java🎜rrreee🎜Utilisez le package :com.zimug
dans le module importé common.widget
. Ce chemin de fichier de code : 🎜🎜modules-example/src/data.widget/com/example/Component.java🎜rrreee🎜Compilez et exécutez normalement, les résultats sont les suivants :🎜rrreee
SimpleRenderer
sous ce package >. Faisons un contre-exemple pour voir ce qui se passe : 🎜rrreee🎜Le message d'erreur de compilation est le suivant : 🎜rrreee🎜Même si la classe est déclarée publique mais non exportée, la classe du package n'est pas accessible. 🎜Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!