Maison >Java >javaDidacticiel >Java9Nouvelle fonctionnalitéMéthode de programmation modulaire du module

Java9Nouvelle fonctionnalitéMéthode de programmation modulaire du module

王林
王林avant
2023-05-19 13:51:16948parcourir

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.

1. Qu'est-ce que le module Java ?

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.

2. Package d'exportation de module

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

如果另一个模块想要使用被导出的package包中的类,可以用requires关键字在其module-info.java文件中来导入(读取)目标模块的package包。

module def.stu{ requires xxx.yyy;}

四、Java module的意义

笔者认为,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

尝试使用未被exports的package代码

由于包“ 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
🎜4. L'importance du module Java🎜🎜L'auteur estime que l'introduction du système de gestion modulaire des modules dans Java 9 est principalement due à des considérations de sécurité. Plus de 90 % des vulnérabilités du code Java sont causées par la réflexion et une granularité insuffisante du contrôle d'accès. Le système modulaire de Java 9 peut résoudre ce problème. La modularité de Java 9 offre un niveau plus élevé de visibilité et de contrôle d'accessibilité du code Java. 🎜🎜À titre d'exemple, lorsque nous marquons une classe comme privée, cela signifie qu'il s'agit d'une classe interne. Il n'y a que deux modificateurs pour les classes externes : public et default. Cela signifie également un problème. Nous avions initialement prévu d'utiliser certaines classes publiques dans la portée définie par le package jar, mais le résultat est que tout projet qui introduit ce jar peut utiliser tous les codes de classe publique de ce jar. 🎜🎜C'est-à-dire que notre intention initiale était de fournir un accès public dans un cadre limité, mais le résultat a été une divulgation illimitée au monde extérieur. Après l'introduction de la modularisation Java 9, un accès public au code dans une portée limitée peut être obtenu, et la divulgation du code peut être divisée en : Accès public à portée limitée en dehors du module et Accès public au sein du module. 🎜🎜5. Exemple 🎜🎜Dans cet exemple, je vais créer deux modules "common.widget" et "data.widget" et les placer sous un seul dossier "modules-examples/src". Le fichier "module-info.java" sera placé sous le dossier racine de chaque module.
Le format du fichier et du répertoire est le suivant : 🎜rrreee

Premier module

🎜Ce répertoire de fichier de code : 🎜
🎜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🎜rrreee

Deuxième module

🎜Le module importe common.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

La tentative d'utilisation n'était pas le code du package pour les exportations

🎜Étant donné que le package "org.jwidgets" n'a pas été exporté via le module "common.widget", un autre module "data.widget" ne peut pas utiliser la classe 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer