Table des matières
1. Qu'est-ce que le module Java ?
2. Package d'exportation de module
三、模块导入package
四、Java module的意义
五、实例
第一个模块
第二个模块
尝试使用未被exports的package代码
Premier module
Deuxième module
La tentative d'utilisation n'était pas le code du package pour les exportations
Maison Java javaDidacticiel Java9Nouvelle fonctionnalitéMéthode de programmation modulaire du module

Java9Nouvelle fonctionnalitéMéthode de programmation modulaire du module

May 19, 2023 pm 01:51 PM
java module

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{
  ....
 }
Copier après la connexion

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;
 }
Copier après la connexion

com.zimug.java9代表一个package。

需要注意的是:即使给定package包中的类是public的,如果未通过’exports’显式导出其程序包,则它们在模块外部也是不可见的(在编译时和运行时都是如此)。

三、模块导入package

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

module def.stu{ requires xxx.yyy;}
Copier après la connexion

四、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
Copier après la connexion

第一个模块

本代码文件目录:

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);
  }
}
Copier après la connexion

本代码文件目录:

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);
  }
}
Copier après la connexion

模块导出,本代码文件目录:modules-example/src/common.widget/module-info.java。只导出com.zimug包,没有导出 org.jwidgets包。导出的模块名称为common.widget

module common.widget{
  exports com.zimug;
}
Copier après la connexion

第二个模块

模块导入common.widget,本代码文件目录:modules-example/src/data.widget/module-info.java

module data.widget {
  requires common.widget;
}
Copier après la connexion

使用导入模块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");
  }
}
Copier après la connexion

正常编译执行,结果如下:

Test Object
Copier après la connexion

尝试使用未被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");
  }
}
Copier après la connexion

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
Copier après la connexion
🎜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 de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Article chaud

R.E.P.O. Crystals d'énergie expliqués et ce qu'ils font (cristal jaune)
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Meilleurs paramètres graphiques
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Comment réparer l'audio si vous n'entendez personne
3 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25: Comment déverrouiller tout dans Myrise
4 Il y a quelques semaines By 尊渡假赌尊渡假赌尊渡假赌

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Nombre parfait en Java Nombre parfait en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre parfait en Java. Nous discutons ici de la définition, comment vérifier le nombre parfait en Java ?, des exemples d'implémentation de code.

Générateur de nombres aléatoires en Java Générateur de nombres aléatoires en Java Aug 30, 2024 pm 04:27 PM

Guide du générateur de nombres aléatoires en Java. Nous discutons ici des fonctions en Java avec des exemples et de deux générateurs différents avec d'autres exemples.

Weka en Java Weka en Java Aug 30, 2024 pm 04:28 PM

Guide de Weka en Java. Nous discutons ici de l'introduction, de la façon d'utiliser Weka Java, du type de plate-forme et des avantages avec des exemples.

Numéro de Smith en Java Numéro de Smith en Java Aug 30, 2024 pm 04:28 PM

Guide du nombre de Smith en Java. Nous discutons ici de la définition, comment vérifier le numéro Smith en Java ? exemple avec implémentation de code.

Questions d'entretien chez Java Spring Questions d'entretien chez Java Spring Aug 30, 2024 pm 04:29 PM

Dans cet article, nous avons conservé les questions d'entretien Java Spring les plus posées avec leurs réponses détaillées. Pour que vous puissiez réussir l'interview.

Break or Return of Java 8 Stream Forach? Break or Return of Java 8 Stream Forach? Feb 07, 2025 pm 12:09 PM

Java 8 présente l'API Stream, fournissant un moyen puissant et expressif de traiter les collections de données. Cependant, une question courante lors de l'utilisation du flux est: comment se casser ou revenir d'une opération FOREAK? Les boucles traditionnelles permettent une interruption ou un retour précoce, mais la méthode Foreach de Stream ne prend pas directement en charge cette méthode. Cet article expliquera les raisons et explorera des méthodes alternatives pour la mise en œuvre de terminaison prématurée dans les systèmes de traitement de flux. Lire plus approfondie: Améliorations de l'API Java Stream Comprendre le flux Forach La méthode foreach est une opération terminale qui effectue une opération sur chaque élément du flux. Son intention de conception est

Horodatage à ce jour en Java Horodatage à ce jour en Java Aug 30, 2024 pm 04:28 PM

Guide de TimeStamp to Date en Java. Ici, nous discutons également de l'introduction et de la façon de convertir l'horodatage en date en Java avec des exemples.

Créer l'avenir : programmation Java pour les débutants absolus Créer l'avenir : programmation Java pour les débutants absolus Oct 13, 2024 pm 01:32 PM

Java est un langage de programmation populaire qui peut être appris aussi bien par les développeurs débutants que par les développeurs expérimentés. Ce didacticiel commence par les concepts de base et progresse vers des sujets avancés. Après avoir installé le kit de développement Java, vous pouvez vous entraîner à la programmation en créant un simple programme « Hello, World ! ». Une fois que vous avez compris le code, utilisez l'invite de commande pour compiler et exécuter le programme, et « Hello, World ! » s'affichera sur la console. L'apprentissage de Java commence votre parcours de programmation et, à mesure que votre maîtrise s'approfondit, vous pouvez créer des applications plus complexes.

See all articles