java9区分opens与exports

Java 9引入了一些新的模块系统特性,包括opens和exports,主要是为了更好地实现模块化开发,提高代码安全性。

opens和exports的概念

  • opens:可以让模块中的某个包在运行时可以被其他模块反射调用。
  • exports:可以让模块中的某个包在编译时和运行时都可以被其他模块访问和使用。

区分opens和exports的攻略

  1. 在module-info.java文件中使用opens指令来打开模块中某个包的反射权限,使用exports指令来公开模块中某个包的使用权限。可以使用“模块名/包名”的方式指定需要打开或公开的包,也可以使用通配符来指定。

例如,在一个名为com.example.foo的模块中,如果要开放com.example.bar包的反射权限,可以在module-info.java文件中添加如下代码:

opens com.example.bar to module1, module2;

这样,其他模块module1和module2就可以使用反射来访问com.example.bar包中的类、变量和方法了。

而如果要公开com.example.baz包的使用权限,可以在module-info.java中添加如下代码:

exports com.example.baz to module1, module2;

这样,其他模块module1和module2就可以直接使用com.example.baz包中的类、变量和方法了。

  1. 可以使用jdeps工具来查看模块之间的依赖关系和可能存在的问题。例如,可以使用下面的命令来查看某个模块的依赖情况:
jdeps --module-path <path-to-modules> --list-deps <module-name>

其中,--module-path指定了模块路径,是模块所在的路径,--list-deps指定了要查看依赖关系的模块名,是要查看的模块名。

示例1:opens

假设有两个模块:moduleA和moduleB,其中moduleA定义了一个类MyClass,可以使用反射调用其中的方法、变量等。而moduleB需要使用moduleA中MyClass类中的某个方法,这时就需要在moduleA中打开MyClass的反射权限。

首先,在moduleA的module-info.java文件中添加如下代码:

opens com.example.common.model to moduleB;

这样,就在moduleA中开放了com.example.common.model包的反射权限,同时指定moduleB可以访问。

然后,在moduleB中使用反射来调用moduleA中MyClass类的test方法,代码如下:

Class<?> clazz = Class.forName("com.example.common.model.MyClass");
Method method = clazz.getDeclaredMethod("test");
method.invoke(null);

这样,moduleB就可以成功调用moduleA中MyClass类的test方法了。

示例2:exports

本例中有两个模块:moduleA和moduleB,其中moduleA定义了一个类MyClass,而moduleB需要使用MyClass类中的某个方法,这时就需要在moduleA中公开MyClass类的使用权限。

首先,在moduleA的module-info.java文件中添加如下代码:

exports com.example.common.model to moduleB;

这样,就在moduleA中公开了com.example.common.model包的使用权限,同时指定moduleB可以访问。

然后,在moduleB中正常使用MyClass类的test方法,代码如下:

MyClass myClass = new MyClass();
myClass.test();

这样,moduleB就可以成功访问moduleA中MyClass类的test方法了。

总的来说,使用opens和exports都是为了实现模块化开发,提高代码安全性。开发者需要根据实际的需求来选择具体的使用方式。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java9区分opens与exports - Python技术站

(0)
上一篇 2023年5月21日
下一篇 2023年5月21日

相关文章

  • JavaBean(EJB) 3.0 全新体验

    JavaBean(EJB) 3.0 全新体验 JavaBean(EJB) 3.0 是Java EE的一种规范,提供了基于组件的编程模型,可以使开发者快速、高效地构建分布式、可维护和安全的应用程序。下面我们介绍如何使用JavaBean(EJB) 3.0构建应用程序。 步骤一:定义JavaBean(EJB) JavaBean(EJB) 是一个Java类,用于封装…

    database 2023年5月21日
    00
  • SQL Server 2005 RTM 安装错误 :The SQL Server System Configuration Checker cannot be executed due to

    首先,该错误提示意味着SQL Server System Configuration Checker 无法运行。这可能是由于某些不足之处,如未正确安装要求的组件、操作系统版本错误、权限不足等。 以下是几个可能的解决方案: 1.确保系统满足SQL Server 2005的最低要求 操作系统:Windows XP SP2以上,Windows Server 200…

    database 2023年5月18日
    00
  • SQL Server中函数、存储过程与触发器的用法

    SQL Server是一种关系型数据库管理系统,提供了许多常用的功能,如函数、存储过程和触发器等。这些功能可以提高数据库应用程序的可靠性和性能。下面我们逐个介绍这些功能及其用法。 一、函数 1.1 概述 函数是一种带有输入参数和返回值的可重复使用代码块。SQL Server提供了多种内置函数以及自定义函数。使用函数可以简化SQL语句,提高效率。 1.2 内置…

    database 2023年5月21日
    00
  • MySql获取当前时间并转换成字符串的实现

    下面是MySQL获取当前时间并转换成字符串的实现攻略。 方法一:使用DATE_FORMAT函数 MySQL中可以使用DATE_FORMAT函数将日期时间类型转换成指定格式的字符串。以下是使用DATE_FORMAT函数获取当前时间并转换成字符串的语句: SELECT DATE_FORMAT(NOW(), ‘%Y-%m-%d %H:%i:%s’); 执行此语句,…

    database 2023年5月22日
    00
  • linux top命令详解

    Linux top命令详解 简介 top 命令是 Linux 下用于实时监视系统的命令。它能动态地实时显示进程的资源占用情况,包括 CPU 占用率、内存使用、进程、线程等信息。 语法 top 命令的语法格式如下: top [-] [d delay] [-n iterations] [-b] [-c] [-u username] [p pid] 参数说明:- …

    database 2023年5月22日
    00
  • Redis系列12:Redis 的事务机制

    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster 集群模式 追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级数据计算Redis…

    2023年4月10日
    00
  • DBMS 中的死锁

    DBMS 中的死锁 什么是死锁 死锁是指当两个或多个事务相互请求对方占用的资源时,导致系统中出现无法转化的状态,进而导致事务阻塞,无法继续执行的现象。在产生死锁的情况下,没有一个事务可以完成,系统没有办法正常运行。 如何避免死锁 要避免死锁,我们必须去写一些适当的代码,确保事务按照特定的顺序对资源进行访问。下面是一些常见的避免死锁的方法: 加锁顺序:确保在多…

    database 2023年3月27日
    00
  • redis调优 — 内存碎片

    最近查看了一下redis运行状况,发现公司测试服务器的redis内存不太够用,但是实际占用内存的数据量其实不大,以前也没有这种情况,之前在cache层新增了一个防刷积分任务的逻辑才会这样,搜索一下原因,发现原来是产生了大量的内存碎片。 首先,查看redis的内存状态,要用info memory指令   2018-06-01_110028.png ps:(这个…

    Redis 2023年4月11日
    00
合作推广
合作推广
分享本页
返回顶部