网站首页 > java教程 正文
在此章节中,主要学习以下内容:
如何声明模块依赖
模块的隐式可读性意味着什么以及如何声明它
限定导出(exports)与非限定导出之间的差异
如何定义可选的运行时依赖
如何打开整个模块或其选定的软件包进行深层反射
JDK 9中的访问类型
跨模块分割包
模块声明的约束
不同类型的模块:命名,未命名,显式,自动,普通和开放的模块
如何使用javap工具来解析模块的定义
一. 声明模块依赖
如果一个模块需要使用另一个模块中的公共类,第二个模块需要导出包含公共类型的包同时第一个模块需要读取第二个模块。注意,两个模块之间的依赖声明是不对称的,提供类的模块对外导出的是包(package),然而使用类的模块读取的是模块(module)。
假设你现在已经有两个模块,分别是:
com.jdojo.address:包含Address类
com.jdojo.person:包含Person类。
其中,com.jdojo.person模块想使用com.jdojo.address模块下的Address类,其模块图如下所示:
在NetBeans中,可以创建两个名为com.jdojo.address和com.jdojo.person的Java项目。 每个项目将包含与项目名称相同的模块的代码。下面包含了com.jdojo.address的模块声明和Address类的代码。
module com.jdojo.address {
exports com.jdojo.address;
}
package com.jdojo.address;
public class Address {
private String line1 = "1111 Main Blvd.";
private String city = "Jacksonville";
private String state = "FL";
private String zip = "32256";
public Address() {
}
public Address(String line1, String line2, String city,
String state, String zip) {
this.line1 = line1;
this.city = city;
this.state = state;
this.zip = zip;
}
public String getZip() {
return zip;
}
public void setLine1(String line1) {
this.line1 = line1;
}
public void setCity(String city) {
this.city = city;
}
public void setState(String state) {
this.state = state;
}
public void setZip(String zip) {
this.zip = zip;
}
public String getLine1() {
return line1;
}
public String getCity() {
return city;
}
public String getState() {
return state;
}
@Override
public String toString() {
return "[Line1:" + line1 + ", State:" + state
+ ", City:" + city + ", ZIP:" + zip + "]";
}
}
exports语句用于将包导出到所有其他模块或某些命名模块。 被导出包中的所有公共类都可以在编译时和运行时访问。 在运行时,可以使用反射来访问公共类的公共成员。 公共类的非公开成员无法使用反射进行访问,即使这些成员上使用了setAccessible(true)方法。
exports语句的一般语法如下所示:
exports <package>;
该语句将<package>中的所有公共类型导出到所有其他模块。 也就是说,读取此模块的任何模块都将能够使用<package>中的所有公共类型。
com.jdojo.address模块导出com.jdojo.address包,因此Address类可以由其他模块使用,它是公共的,也可以在com.jdojo.address包中使用。所以可以在com.jdojo.person模块中使用Address类。
下列包含com.jdojo.person模块的模块声明和Person类的代码。
module com.jdojo.person {
requires com.jdojo.address;
exports com.jdojo.person;
}
package com.jdojo.person;
import com.jdojo.address.Address;
public class Person {
private long personId;
private String firstName;
private String lastName;
private Address address = new Address();
public Person(long personId, String firstName, String lastName) {
this.personId = personId;
this.firstName = firstName;
this.lastName = lastName;
}
public long getPersonId() {
return personId;
}
public void setPersonId(long personId) {
this.personId = personId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "[Person Id:" + personId + ", First Name:" + firstName
+ ", Last Name:" + lastName + ", Address:" + address + "]";
}
}
猜你喜欢
- 2024-09-11 Java 9最终发布可能会推迟8周,到9月21日
- 2024-09-11 JAVA9模块化详解(一)——模块化的定义
- 2024-09-11 java 9 更新内容整理(java基础知识点整理)
- 2024-09-11 轻松上手Java 9模块化开发核心原则与实践
- 2024-09-11 Java 9 揭秘-模块化系统(二)(java9安装教程)
- 2024-09-11 Java9系列第8篇-Module模块化编程
- 2024-09-11 Java 9揭秘-模块依赖(十二)(java9模块化为啥没大规模使用)
- 2024-09-11 Java 9揭秘-模块依赖(七)(java9是什么版本)
- 2024-09-11 Java9新特性Jigsaw和Jshell(java9 模块化 系统)
- 2024-09-11 Java9新特性中的模块化到底是什么
你 发表评论:
欢迎- 最近发表
-
- Java常量定义防暴指南:从"杀马特"到"高富帅"的华丽转身
- Java接口设计原则与实践:优雅编程的艺术
- java 包管理、访问修饰符、static/final关键字
- Java工程师的代码规范与最佳实践:优雅代码的艺术
- 编写一个java程序(编写一个Java程序计算并输出1到n的阶乘)
- Mycat的搭建以及配置与启动(mycat部署)
- Weblogic 安装 -“不是有效的 JDK Java 主目录”解决办法
- SpringBoot打包部署解析:jar包的生成和结构
- 《Servlet》第05节:创建第一个Servlet程序(HelloSevlet)
- 你认为最简单的单例模式,东西还挺多
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)