当前位置: 首页 > 知识库问答 >
问题:

合成领域的Java模块系统是否被打破?

姜振濂
2023-03-14
module java.base {
  ...
  exports java.lang.reflect to <some java and custom modules>;
  ...
}
public class SomeJavassistProxy extends SomeClass implements WriteReplaceInterface, ProxyObject {
   private MethodHandler handler;
   private static Method[] _methods_;
   ...

Java抛出某种类型的“Java.lang.IllegalAccessError类SomeJavassistProxy(在未命名模块中)无法访问类Java.lang.Reflect.Method(在模块Java.base中),因为模块Java.base不将Java.lang.Reflect导出到未命名模块”。

这是预期的行为。

然后我尝试了bytebuddy库,它生成了以下类:

public class SomeClass$HibernateProxy$7DKVefUe extends SomeClass implements HibernateProxy, ProxyConfiguration {
   private Interceptor $$_hibernate_interceptor;
   // $FF: synthetic field
   private static final Method cachedValue$ghVgnbHc$4cscpe1 = Object.class.getMethod("toString");
   // $FF: synthetic field
   private static final Method cachedValue$ghVgnbHc$o23rrk2 = HibernateProxy.class.getMethod("getHibernateLazyInitializer");
   ...

共有1个答案

薄瑞
2023-03-14

对不起,我的错误。
发现只有当您从不能访问该包的模块(在我的例子中是未命名的模块)内的安全包(在我的例子中是java.lang.reflect)中实际调用方法时,才会抛出IllegalAccessError。
如果只是对安全包的引用,则不会抛出异常。

在bytebuddy的示例中,在未命名模块中只有对方法类的引用。这个引用被传递给拦截器类(在我的例子中,它属于可以访问java.lang.Reflect的自动模块),方法的实际调用发生在这里。

所以,它与合成场无关。

 类似资料:
  • 伴随着移动互联的大潮,当今越来越多的网站已经从网页模式进化到了 Webapp 模式。它们运行在现代的高级浏览器里,使用 HTML5、 CSS3、 ES6 等更新的技术来开发丰富的功能,网页已经不仅仅是完成浏览的基本需求,并且webapp通常是一个单页面应用,每一个视图通过异步的方式加载,这导致页面初始化和使用过程中会加载越来越多的 JavaScript 代码,这给前端开发的流程和资源组织带来了巨大

  • 模块系统 Rust有两个与模块 (module) 系统相关的独特术语:crate和module, 其中包装箱 (crate) 与其它语言中的 libary 或者 package 作用一样。 每个包装箱都有一个隐藏的根模块,在根模块下可以定义一个子模块树, 其路径采用::作为分隔符。包装箱由条目 (item) 构成,多个条目通过模块组织在一起。 定义模块 使用mod关键字定义我们的模块: // in

  • 主要内容:模块系统特征,创建模块Java 9是一种称为模块的新型编程组件。模块是一个自我描述的代码和数据集合,并有一个名称来标识它。 模块系统特征 使用模块组件,Java 9中增加了以下增强功能 - 引入了一个新的可选阶段,即链接时间。这个阶段介于编译时间和运行时间之间。 在此阶段,可以组合和优化一组模块,使用jlink工具制作自定义运行时映像。 javac,jlink和java有额外的选项来指定模块路径,它们进一步定位模块的定

  • 主要内容:引入模块,服务端的模块放在哪里为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。 引入模块 在 Node.js 中,引入一个模块非常简单,如下我们创建一个 main.js 文件并引入 hello 模

  • 为了让Node.js的文件可以相互调用,Node.js提供了一个简单的模块系统。 模块是Node.js 应用程序的基本组成部分,文件和模块是一一对应的。换言之,一个 Node.js 文件就是一个模块,这个文件可能是JavaScript 代码、JSON 或者编译过的C/C++ 扩展。 创建模块 在 Node.js 中,创建一个模块非常简单,如下我们创建一个 main.js 文件,代码如下: var

  • 问题内容: Python是否具有包/模块管理系统,类似于Ruby在哪里可以使用rubygems ? 在“ 安装Python模块”上 ,我仅看到对的引用,但这需要您首先找到该软件包。 问题答案: 2014年3月 :好消息!Pip随附了Python 3.4 。Pip长期以来一直是Python的事实上的标准包管理器。您可以这样安装软件包: 哇!这是所有Python版本中的最佳功能。它使每个人都可以访问社