关于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的去重逻辑可知,该方法通过名称+位置判断是否为同一记录组件,但类文件解析与源码解析得到的组件位置不同,因此无法去重,导致出现重复条目。
待确认问题
TypeElement.getRecordComponents()返回同一记录组件的两个条目是否符合JDK规范预期?RecordComponent.getAccessor()返回null是否符合JDK规范预期?- 这属于JDK Bug,还是注解处理器应当自行忽略无accessor的记录组件?
补充信息
Java 17.0.5、19.0.2、21.ea.7版本均存在此问题,已制作复现项目。
内容的提问来源于stack exchange,提问作者Clément MATHIEU
相关产品推荐
相关产品推荐

