Heim >Java >javaLernprogramm >Modulare Programmiermethode für neue Java9-Funktionsmodule
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.
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.
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包中的类,可以用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
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.
🎜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
🎜rrreeecommon.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
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!