java17模块化开发

关于模块的常用命令

java --list-modules
# 导入一个不是有JAVA.base的包。需要使用requires指定哪个平台模块,提供了这个包。

# 检查平台模块的模块声明
java --describe-module javafx.controls


# http://branch.andbound.net

模块依赖及开放和使用服务

服务提供模块A

// A模块提供
//提供的服务实现类需要包含午餐构造方法,若有参数需要实现一个static方法
module A {
	exports com.service;
	provides com.service.Connect with com.serviceimpl.ConnectImpl,com.serviceimpl.Connect2Impl;
}
// Connect 服务
interface Connect {
	void connect()
}
//包含无参构造
class ConnectImpl implements Connect{
	
	public ConnectImpl() {
			
	}
	public void connect() {
	}
}
// 没有无参构造方法使用静态provider方法
class Connect2Impl implements Connect{
	public ConnectImpl(String name) {
			
	}
	public void connect() {
	}
	public static Connect provider() {
		return new ConnectImpl("abc");
	}
}

服务使用模块B

module B {
	requrires A;
	requrires transitive A;  //传递依赖-例如:聚合模块-java.se
	//这样就能使用A模块Connect接口的所有服务
	uses com.service.Connect;
	}

//实现获取
ServiceLoader<Connect> cs = ServiceLoader.load(Connect.class);
for(Connect c: cs) {
	c.connect();
}

模块间反射的使用

// attention1: exports 导出的public属性或者方法可以使用反射访问不用opens,但是非public则不能
// attention2: 使用opens则不论是否是public, 设置强制访问可以生效
module A {
	//包名称
	exports com.service;// >> to  C,D  可以指定导出对CD模块可读,其他模块不可读
	opens com.service;
}

你可能感兴趣的:(java基础,java)