java9区分opens与exports

yizhihongxing

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日

相关文章

  • MySQL中的异常处理

      与java中的异常一样,都是用来定义在处理过程中遇到的问题以及相应的处理方式。 2,自定义异常及处理方式   1,自定义异常语句     DECLARE condition_name CONDITION FOR condition_value;     condition_name:是自己起的名字,最好见名知意。     condition_value:…

    MySQL 2023年4月13日
    00
  • java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input

    让我详细讲解一下“java.sql.SQLException: 内部错误: Unable to construct a Datum from the specified input”的解决方法: 1. 问题背景 在使用Java进行数据库连接和查询时,可能会遇到以下错误提示: java.sql.SQLException: 内部错误: Unable to con…

    database 2023年5月21日
    00
  • redis分页获取数据

    php代码: 采用哈希类型存储数据,有序集合存储分页数据,进行倒序与正序的排序。 $getGoodsInfo = M(‘goods_test’)->select(); for($i=0;$i<count($getGoodsInfo);$i++){ $addStatus = $obRedis->zAdd(‘goods_key’,$getGoo…

    Redis 2023年4月12日
    00
  • 浅谈Spring Batch在大型企业中的最佳实践

    浅谈Spring Batch在大型企业中的最佳实践 简介 Spring Batch 是一个轻量级的、全面、可扩展的开源框架,用于支持企业级批处理作业的开发。它提供了可重用的函数来处理大量记录,包括日志、事务、统计等常见的批处理任务,平滑地解决了批处理作业的关键问题。本文将从以下几个方面来介绍 Spring Batch 在大型企业中的最佳实践: 大型企业中的 …

    database 2023年5月21日
    00
  • 详解MySQL中数据类型和字段类型

    详解MySQL中数据类型和字段类型 在MySQL中,我们可以根据需要定义不同的数据类型和字段类型。掌握了这些知识,可以让我们更好地设计数据库表结构,提高数据的存储效率和查询效率。本文将详细讲解MySQL中的数据类型和字段类型,供大家参考。 MySQL数据类型 MySQL支持多种数据类型,包括整型、浮点型、日期型等,下面是一些常用的数据类型: 整型 TINYI…

    database 2023年5月22日
    00
  • Mybatis批量修改联合主键数据的两种方法

    Mybatis批量修改联合主键数据的两种方法 如果我们要批量修改Mybatis中的联合主键数据,那么我们需要采用一些特殊的方法,本文将介绍两种方法。 方法一:使用foreach标签 我们可以使用Mybatis的foreach标签来批量修改联合主键数据。 <update id="updateBatch" parameterType=&…

    database 2023年5月22日
    00
  • Java面试题冲刺第二天–Redis篇

    下面我将针对Java面试题冲刺第二天–Redis篇的完整攻略进行讲解。 Redis的基本概念 什么是Redis Redis是一个高性能的Key-Value类型的NoSQL数据库,它通常用作缓存、消息队列、排行榜等。Redis支持数据保存到内存中,并可以异步地保存修改到磁盘上,同时还能把修改操作记录到日志中。 Redis的数据类型 Redis支持多种数据类型…

    database 2023年5月22日
    00
  • MySQL进阶查询、聚合查询和联合查询

    MySQL进阶查询、聚合查询和联合查询是MySQL数据库中非常重要的一部分,其能够对大数据进行高效的查询、分析和处理。以下是MySQL进阶查询、聚合查询和联合查询的完整攻略: MySQL进阶查询 MySQL进阶查询包括多表查询、子查询、联合查询等。在进行多表查询时,需要使用到MySQL的JOIN关键字,下面是一个示例: 示例1:多表查询 我们有两个表stud…

    database 2023年5月22日
    00
合作推广
合作推广
分享本页
返回顶部