Heim  >  Artikel  >  Java  >  Modulare Programmiermethode für neue Java9-Funktionsmodule

Modulare Programmiermethode für neue Java9-Funktionsmodule

王林
王林nach vorne
2023-05-19 13:51:16881Durchsuche

Die Java-Sprache hat in ihrer Version 9 ein wichtiges Konzept eingeführt – das Modul. Wenn Sie mit der modularen Verwaltung von JavaScript-Code vertraut sind, sollten Sie sich vertraut fühlen, wenn Sie die modulare Verwaltung von Java 9 sehen.

1. Was ist ein Java-Modul?

Module führt eine höhere Ebene der Java-Codegruppierung ein, ähnlich wie bei Paketen in Java. Jede dieser Gruppen (Module) enthält viele Unterpakete. Deklarieren Sie den Ordner und seine Unterordner als Modul, indem Sie die Datei module-info.java zum Stammverzeichnis des Quellcodedateipakets eines Moduls hinzufügen. Die Syntax der Datei lautet wie folgt:

 module xxx.yyy{
  ....
 }

wobei xxx.yyy der vom Modulmodul deklarierte Name ist, nicht der Paketname.

2. Modulexportpaket

Die Datei module-info.java kann angeben, welche Pakete unter dem Modul für die Außenwelt sichtbar und zugänglich sind. Diese Funktion wird durch ein neues Schlüsselwort exports implementiert. 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 stellt ein Paket dar.

Hinweis: Auch wenn die Klassen in einem bestimmten Paket öffentlich sind und ihr Paket nicht explizit über „Exporte“ exportiert wird, sind sie außerhalb des Moduls nicht sichtbar (zur Kompilierungszeit und Dies gilt während der Laufzeit).

3. Modulimportpaket🎜🎜Wenn ein anderes Modul die Klassen im exportierten Paket verwenden möchte, kann es das Schlüsselwort requires in seiner module-info.java-Datei verwenden. lesen) das Paketpaket des Zielmoduls. 🎜
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. Die Bedeutung des Java-Moduls🎜🎜Der Autor ist der Ansicht, dass die Einführung des modularen Verwaltungssystems in Java 9 hauptsächlich auf Sicherheitsüberlegungen zurückzuführen ist. Mehr als 90 % der Schwachstellen im Java-Code werden durch Reflexion und unzureichende Granularität der Zugriffskontrolle verursacht. Das modulare System von Java 9 kann dieses Problem lösen. Die Modularität von Java 9 bietet ein höheres Maß an Sichtbarkeit und Zugänglichkeitskontrolle von Java-Code. 🎜🎜Wenn wir beispielsweise eine Klasse als privat markieren, bedeutet dies, dass es sich um eine innere Klasse handelt. Für externe Klassen gibt es nur zwei Modifikatoren: public und default. Dies bedeutet auch ein Problem. Wir hatten ursprünglich geplant, einige öffentliche Klassen innerhalb des durch das JAR-Paket definierten Bereichs zu verwenden, aber das Ergebnis ist, dass jedes Projekt, das dieses JAR einführt, alle öffentlichen Klassencodes in diesem JAR verwenden kann. 🎜🎜Das heißt, unsere ursprüngliche Absicht bestand darin, den öffentlichen Zugang in einem begrenzten Umfang zu ermöglichen, aber das Ergebnis war eine uneingeschränkte Offenlegung nach außen. Nach der Einführung der Java 9-Modularisierung kann öffentlicher Zugriff auf Code innerhalb eines begrenzten Umfangs erreicht werden, und die Offenlegung von Code kann unterteilt werden in: öffentlicher Zugriff mit begrenztem Umfang außerhalb des Moduls und Öffentlicher Zugriffinnerhalb des Moduls. 🎜🎜5. Beispiel 🎜🎜In diesem Beispiel erstelle ich zwei Module „common.widget“ und „data.widget“ und platziere sie in einem einzigen Ordner „modules-examples/src“. Die Datei „module-info.java“ wird im Stammordner jedes Moduls abgelegt.
Das Datei- und Verzeichnisformat ist wie folgt: 🎜rrreee

Erstes Modul

🎜Dieses Codedateiverzeichnis: 🎜
🎜modules-example/src/common.widget/org/jwidgets/SimpleRenderer .java. 🎜
🎜Dieses Paket wird im folgenden Artikel nicht exportiert. 🎜rrreee🎜Dieses Codedateiverzeichnis: 🎜
🎜modules-example/src/common.widget/com/zimug/RendererSupport.java. 🎜
🎜Dieses Paket wird später exportiert. 🎜rrreee🎜Modulexport, dieses Codedateiverzeichnis: module-example/src/common.widget/module-info.java. Es wird nur das Paket com.zimug exportiert, das Paket org.jwidgets wird nicht exportiert. Der exportierte Modulname ist common.widget🎜rrreee

Zweites Modul

🎜Das Modul importiert common.widget, dieses Codedateiverzeichnis: module-example / src/data.widget/module-info.java🎜rrreee🎜Verwenden Sie das Paket:com.zimug im importierten Modul common.widget. Pfad dieser Codedatei: 🎜
🎜modules-example/src/data.widget/com/example/Component.java🎜
rrreee🎜Kompilieren und normal ausführen, die Ergebnisse sind wie folgt:🎜rrreee

Versuch, den Paketcode für Exporte nicht zu verwenden

🎜Da das Paket „org.jwidgets“ nicht über das Modul „common.widget“ exportiert wurde, kann ein anderes Modul „data.widget“ die Klasse SimpleRenderer nicht verwenden unter diesem Paket >. Machen wir ein Gegenbeispiel, um zu sehen, was passiert: 🎜rrreee🎜Die Kompilierungsfehlermeldung lautet wie folgt: 🎜rrreee🎜Auch wenn die Klasse als öffentlich deklariert, aber nicht exportiert ist, kann nicht auf die Klasse im Paket zugegriffen werden. 🎜

Das obige ist der detaillierte Inhalt vonModulare Programmiermethode für neue Java9-Funktionsmodule. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:yisu.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen