You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于TypeElement.getRecordComponents()返回重复记录组件的问询

record-builder注解处理器的JDK符号解析异常问题

在排查record-builder的问题时发现:当生成的ConfRecord类文件已存在时,调用TypeElement.getRecordComponents()会返回两个同名的maxConcurrency记录组件:

  • 组件1:由类文件解析生成,属性为name: maxConcurrency, pos: 1, accessor: null
  • 组件2:由注解处理器读取生成源码时生成,属性为name: maxConcurrency, pos: 387, accessor: <value>

背景说明

record-builder支持从接口生成对应记录类,例如定义如下接口:

@RecordInterface
interface Conf {
    int maxConcurrency();
}

会自动生成以下代码:

@Generated("io.soabase.recordbuilder.core.RecordInterface")
@RecordBuilder
public record ConfRecord(int maxConcurrency) implements Conf, ConfRecordBuilder.With {}

问题根源

查看Symbol#getRecordComponent的去重逻辑可知,该方法通过名称+位置判断是否为同一记录组件,但类文件解析与源码解析得到的组件位置不同,因此无法去重,导致出现重复条目。

待确认问题

  1. TypeElement.getRecordComponents()返回同一记录组件的两个条目是否符合JDK规范预期?
  2. RecordComponent.getAccessor()返回null是否符合JDK规范预期?
  3. 这属于JDK Bug,还是注解处理器应当自行忽略无accessor的记录组件?

补充信息

Java 17.0.5、19.0.2、21.ea.7版本均存在此问题,已制作复现项目。


内容的提问来源于stack exchange,提问作者Clément MATHIEU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 01:31:19