如何使用M3提取Java注解信息以实现代码生成(如ER模型)?
使用M3提取Java注解并实现代码生成
一、从M3模型提取注解信息的步骤
你已经熟悉createM3FromFile和createAstFromFile,基于M3模型提取注解可按以下流程操作:
- 加载目标模型:通过
createM3FromFile加载带注解的Java文件,得到完整的M3元模型。M3会将Java类、字段、注解等元素抽象为可查询的模型节点。 - 筛选实体类:遍历模型中的
Class类型节点,检查节点的annotations集合,筛选出带有javax.persistence.Entity注解的类(即你的实体类)。 - 提取字段注解:对每个实体类,遍历其关联的
fields节点,逐个解析字段上的注解:- 对于
@Column,提取name、nullable、length等属性值; - 对于
@Id、@GeneratedValue,标记主键及生成策略; - 对于
@OneToMany,提取mappedBy属性和关联的目标实体类型。
- 对于
示例查询逻辑(伪代码)
// 假设m3是已加载的模型实例 for (classNode in m3.Class) { // 判断是否为Entity类 isEntity = any(ann in classNode.annotations where ann.name == "javax.persistence.Entity") if (!isEntity) continue // 提取实体类信息 entityInfo = { name: classNode.name, fields: [] } // 遍历字段解析注解 for (fieldNode in classNode.fields) { fieldData = { name: fieldNode.name, type: fieldNode.type.name, annotations: {} } // 解析@Column注解 columnAnn = first(ann in fieldNode.annotations where ann.name == "javax.persistence.Column") if (columnAnn) { fieldData.annotations.Column = { name: columnAnn.properties["name"].value, nullable: columnAnn.properties["nullable"].value, length: columnAnn.properties["length"].value } } // 解析@OneToMany注解 oneToManyAnn = first(ann in fieldNode.annotations where ann.name == "javax.persistence.OneToMany") if (oneToManyAnn) { fieldData.annotations.OneToMany = { mappedBy: oneToManyAnn.properties["mappedBy"].value, targetEntity: fieldNode.type.name } } // 标记主键 if (any(ann in fieldNode.annotations where ann.name == "javax.persistence.Id")) { fieldData.isPrimaryKey = true // 提取@GeneratedValue策略 genValueAnn = first(ann in fieldNode.annotations where ann.name == "javax.persistence.GeneratedValue") if (genValueAnn) { fieldData.generationStrategy = genValueAnn.properties["strategy"].value } } entityInfo.fields.push(fieldData) } // 存储实体信息,用于后续代码生成 entities.push(entityInfo) }
二、基于注解信息实现代码生成
以生成DDL脚本或ER模型描述为例:
- 生成DDL:根据实体类名生成表名,字段的
@Column属性生成列定义,主键注解生成主键约束,@OneToMany关联生成外键语句。 - 生成ER模型:将提取的实体、字段、关联关系整理为结构化数据(如JSON),可直接用于渲染ER图或导入可视化工具。
三、学习资源
- M3元模型核心文档:聚焦
Class、Field、Annotation等节点的属性与关联关系,掌握模型查询的基本方式。 - JPA官方注解参考:熟悉
@Entity、@Column等注解的标准属性定义,确保解析时覆盖所有关键配置。 - 代码生成模板示例:参考基于M3的代码生成项目,学习如何将模型数据与模板引擎结合,高效生成目标代码。
内容的提问来源于stack exchange,提问作者Pius Arhanbhunde
相关产品推荐
相关产品推荐

