写点什么

Java 架构师:ASM 已经过时,建议使用类文件 API 简化开发

  • 2024-01-07
    北京
  • 本文字数:2170 字

    阅读完需:约 7 分钟

大小:605.33K时长:03:26
Java架构师:ASM已经过时,建议使用类文件API简化开发

JEP 457,类文件API(Class-File API,预览),最近已经集成到了 JDK 22 中。该 JEP 建议提供一个 API 来解析、生成和转换 Java 类文件。它最初将作为 JDK 中 Java 字节码操作和分析框架ASM的内部替代品,并计划将其作为公共 API 开放。甲骨文的 Java 语言架构师Brian Goetz将 ASM 描述为“带有大量遗留包袱的旧代码库”,并提供了关于该草案将如何发展并最终取代 ASM 的背景信息

 

类文件 API 的核心是几项关键原则。首先,它将类文件实体(比如字段、方法、属性和字节码指令)均视为不可变对象。这种不可变的表述确保在类文件转换时可以可靠地进行共享。该 API 采用树形结构来反映类文件的层次结构,从而支持用户驱动的导航以进行高效地解析。它还强调了解析过程的延迟性,即只会处理满足用户需求所需的类文件。

 

类文件 API 位于java.lang.classfile包及其子包中,包含三个主要的抽象,即元素、构建器和转换。元素是类文件组件的不可变描述。构建器对应于每种复合元素,可以使用特定的构建方法来方便地构造类文件。转换表示在构建过程中修改元素的函数。

该 API 还引入了使用模式解析类文件的新方法,与 ASM 基于访问者(visitor)的方式有所不同。这支持更直接和更简洁的表达式,利用了 Java 的模式匹配功能。例如,开发人员可以遍历 CodeModel 中的指令,并匹配感兴趣的元素,以完成像依赖图构造这样的任务。

 

考虑如下的样例:

CodeModel code = ...;Set<ClassDesc> deps = new HashSet<>();for (CodeElement e : code) {    switch (e) {        case FieldInstruction f  -> deps.add(f.owner());        case InvokeInstruction i -> deps.add(i.owner());        // ... and so on for instanceof, cast, etc ...    }}
复制代码

这个代码片段展示了使用模式匹配来解析 Code 属性以收集类依赖关系图的依赖,迭代指令并匹配特定的类型。

 

使用构建器生成类文件是另一项关键特性。该 API 颠覆了使用构造函数或工厂创建构建器的传统习惯,相反,客户端提供一个接受构建器的 lambda。这种方法提供了更具体和透明的代码生成,并且可以重放操作序列。它还为管理块范围、局部变量索引计算和标签管理提供了更高级的便利性。

 

下面的代码展示了如何使用构建器生成方法,演示了该 API 具体且透明的代码生成方式。

ClassBuilder classBuilder = ...;classBuilder.withMethod("fooBar", MethodTypeDesc.of(CD_void, CD_boolean, CD_int), flags,    methodBuilder -> methodBuilder.withCode(codeBuilder -> {        Label label1 = codeBuilder.newLabel();        Label label2 = codeBuilder.newLabel();        codeBuilder.iload(1)            .ifeq(label1)            .aload(0)            .iload(2)            .invokevirtual(ClassDesc.of("Foo"), "foo", MethodTypeDesc.of(CD_void, CD_int))            .goto_(label2)            .labelBinding(label1)            .aload(0)            .iload(2)            .invokevirtual(ClassDesc.of("Foo"), "bar", MethodTypeDesc.of(CD_void, CD_int))            .labelBinding(label2)            .return_();    });
复制代码

类文件的转换功能同样值得注意。解析和生成方法保持了一致,这样转换可以无缝进行。例如,开发人员可以处理一个类,以便于删除特定的方法,或者通过应用各种转换来改变方法体。

 

下面的代码片段展示了 API 的转换类文件的功能,演示了在转换过程中如何有选择地修改或替换类元素。

ClassFile cf = ClassFile.of();ClassModel classModel = cf.parse(bytes);byte[] newBytes = cf.transform(classModel, (classBuilder, ce) -> {    if (ce instanceof MethodModel mm) {        classBuilder.transformMethod(mm, (methodBuilder, me)-> {            if (me instanceof CodeModel cm) {                methodBuilder.transformCode(cm, (codeBuilder, e) -> {                    switch (e) {                        case InvokeInstruction i                                when i.owner().asInternalName().equals("Foo") ->                            codeBuilder.invokeInstruction(i.opcode(), ClassDesc.of("Bar"),                                                           i.name().stringValue(),                                                          i.typeSymbol(), i.isInterface());                        default -> codeBuilder.with(e);                    }                });            }            else                methodBuilder.with(me);        });    }    else        classBuilder.with(ce);});
复制代码

JEP 457 具有变革性的一个方面是如何解决 Java 生态系统中类文件格式的快速发展所带来的挑战。通过提供与 JDK 一起演进的标准 API,它能够确保使用该 API 的框架和工具会自动支持来自最新 JDK 的类文件。这种能力对于新语言和 VM 特性非常重要,它们在类文件中可能会有相应地表述。

 

总之,JEP 457 的类文件 API 是一种具有前瞻性的解决方案,符合 Java 开发的现代化需求。它的设计原则、抽象和转换功能使其成为 Java 开发人员的强大工具,增强了 Java 生态系统中类文件管理的效率和可靠性。

 

原文链接:

 JEP 457: Streamlining Java Development with the Class-File API

2024-01-07 08:0010291

评论

发布
暂无评论
发现更多内容

唐刘:为什么 TiDB 是 AI as a Service (AIaaS) 的最佳选择

TiDB 社区干货传送门

技术趋势

漆包线生产数字化管理:ERP、MES系统详解及选型推荐

万界星空科技

mes 万界星空科技mes 漆包线mes 制造业工厂 漆包线工厂

MyEMS 核心功能拆解:数据采集、能耗分析、智能调控如何落地?

开源能源管理系统

开源 能源管理系统

AI智能辅助系统:用技术重构效率,解锁全场景智能新体验

上海拔俗

和鲸科技入选《大模型一体机产业图谱》,以一体机智驱科研、重塑教学

ModelWhale

人工智能 大模型 高等教育 科研智能

火山引擎推出数据智能体Data Agent评测体系!

字节跳动数据平台

Abaqus软件支持多少人同时使用?达索官方授权代理商推荐

思茂信息

abaqus

从“踩坑”到“精通”:TiDB 应用开发实战指南

TiDB 社区干货传送门

性能调优 OLTP HTAP 8.x 实践

比亚迪出海:从"建"到"简"的车联网修行

科技汇

下一代 AI Agent 的基石:Real-Time AI 新基建丨Convo AI&RTE2025

RTE开发者社区

竞品都在用的秘密武器:境外社交媒体监控网站实战全解析

沃观Wovision

沃观Wovision 舆情监测系统 海外舆情监测 社交媒体监控 海外社交媒体监控

Up!使用 Navicat Premium 连接平凯数据库敏捷模式

TiDB 社区干货传送门

数据库连接 平凯数据库敏捷模式

构建新型电力系统:以云渲染技术破解智慧电网数字孪生应用难题

点量实时云渲染

数字孪生 智慧工厂 协同办公 云渲染 实时渲染云流化

Decart 发布口型实时同步 API;云蝠语音智能体发布网页语音客服模块丨日报

RTE开发者社区

AI 应用软件的外包开发

北京木奇移动技术有限公司

AI智能体 软件外包公司 AI应用开发

MyEMS 的 “智慧大脑”:能耗建模、异常预警与优化策略的技术逻辑

开源能源管理系统

开源 能源管理系统

软件信息化建设方案编制模版(WORD)

金陵老街

项目建设方案 软件模板

TiDB 企业版敏捷模式试用:政企实战场景体验

TiDB 社区干货传送门

社区活动 TEM 试用 平凯数据库敏捷模式

平凯数据库与鸿翼完成互认证,破解亿级文档管理难题

TiDB 社区干货传送门

金融 智能制造 / 汽车 政府及公共事业

TiDB v8.5 新特性解读:Region Size 默认提升至 256 MiB

TiDB 社区干货传送门

新版本/特性解读

产投公司档案AI智能管理系统:用技术让投资档案从“沉睡”到“焕活”

上海拔俗

音乐 NFT 平台的开发

北京木奇移动技术有限公司

区块链开发 软件外包公司 音乐NFT

从沉默到爆发:如何通过海外媒体监控工具发现被忽略的市场机会

沃观Wovision

舆情监测 沃观Wovision 海外舆情监测 社交媒体监控 海外社交媒体监控

轻量化 vs 定制化:不同规模企业如何选择 MyEMS 部署模式?

开源能源管理系统

开源 能源管理系统

大数据-134 ClickHouse 单机+集群节点落地手册 | 安装配置 | systemd 管理 / config.d

武子康

大数据 flink 分布式 Clickhouse clickhouse入仓

从海量噪音到精准洞察:AI驱动的境外社交媒体监控网站解决方案

沃观Wovision

舆情监测 沃观Wovision 海外舆情监测 社交媒体监控 海外社交媒体监控

AI 编程热潮下的万字思考 —— 规避风险,善用其利

Baihai IDP

AI 软件工程 AI编程 氛围编程

区块链 Web3 项目的开发

北京木奇移动技术有限公司

区块链开发 软件外包公司 web3开发

YashanDB数据库基于容器技术的集群部署策略详解

数据库砖家

创新引航,华为云天筹AI求解器斩获全球权威榜单六项第一

新消费日报

使用 Docker Compose 实现 TiDB 平凯数据库敏捷模式的两节点双向复制

TiDB 社区干货传送门

平凯数据库敏捷模式

Java架构师:ASM已经过时,建议使用类文件API简化开发_编程语言_A N M Bazlur Rahman_InfoQ精选文章