您的位置:首页 > 游戏 > 手游 > JDK9 module 新特性

JDK9 module 新特性

2024/12/23 16:08:24 来源:https://blog.csdn.net/ADi_1998/article/details/140702397  浏览:    关键词:JDK9 module 新特性

JDK9 module 新特性

模块结构

  • 模块
    • src
        • 代码.java
      • module-info.java

requires/exports

requires代表需要某个模块、exports代表暴露出哪些包里的类;

● 创建hello.module

module hello.module {exports com.adi;
}
public class HelloProvider {public void sayHello() {System.out.println("hello world~");}
}

● 创建client.module

module client.module {requires hello.module;
}
public class HelloModule {public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {HelloProvider helloProvider = new HelloProvider();helloProvider.sayHello();}
}

transitive

表示依赖传递,例如存在模块A、B、C,B依赖C,如果B声明transitive C,那么A依赖B的情况下自动依赖C;
● 创建base.module

module base.module {exports com.adi.base;
}
public class Base {private String info;public String getInfo() {return info;}public void setInfo(String info) {this.info = info;}public void base() {System.out.println("base module~");}
}

● 调整hello.module

module hello.module {exports com.adi;requires transitive base.module; // 增加
}

● 调整client.module

public class HelloModule {public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {Base base = new Base(); // 可以直接访问到Basebase.base();}
}

opens

该机制主要声明模块内的相关类可以直接暴露给反射机制进行访问;
● 调整base.module

module base.module {exports com.adi.base;// 代表可以被反射获取opens com.adi.base;
}

● 调整client.module

public class HelloModule {public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {// 可以反射处理Base的相关成员属性Field info = base.getClass().getDeclaredField("info");info.setAccessible(true);info.set(base, "This is base info test");System.out.println(base.getInfo());}
}

providers…with…/uses

主要服务于spi机制,可以通过uses直接获取spi服务接口进行load;
● 调整base.module、新增BaseService、修改module-info

public interface BaseService {void service();
}

● 新增service.module

public class ProductService implements BaseService {@Overridepublic void service() {System.out.println("product service ~");}
}
public class SupplyService implements BaseService {@Overridepublic void service() {System.out.println("supply service ~");}
}
module service.module {requires base.module;// 声明spi provides [接口] with [暴露出去的service实现类]provides com.adi.base.BaseService with com.adi.service.ProductService, com.adi.service.SupplyService;
}

● 调整client.module,新增uses声明

module client.module {requires hello.module;// 声明使用spirequires service.module;uses com.adi.base.BaseService;
}
public class HelloModule {public static void main(String[] args) throws IllegalAccessException, NoSuchFieldException {// spi加载service实现ServiceLoader<BaseService> load = ServiceLoader.load(BaseService.class);load.forEach(BaseService::service);}
}

命令行相关操作

● 编译
javac <–module-path 模块存放目录> -d <编译内容存放的目录> [<编译的相关类> <编译的相关类>…]
● 执行
java <–module-path 模块存放目录> -m 主入口类

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com