object类不参与属性映射,真正实现自动映射的是自定义注解+apt+编译期生成mapper类:1.定义@mapto注解标记字段;2.编写处理器扫描并生成usermapper等映射代码;3.mapper类提供frommap/tomap方法;4.object仅因继承关系间接存在,不承担映射逻辑。

Java 中 Object 类本身不直接参与注解处理或属性映射,它只是所有类的根父类,提供如 toString()、hashCode()、equals() 等通用方法。真正实现“对象属性自动映射”的核心不是 Object,而是**自定义注解 + 注解处理器(APT) + 编译期生成辅助类**。下面分几步讲清楚怎么配合实现:
1. 定义用于标记字段的自定义注解
你需要先声明一个运行时保留的注解(或源码级,视需求而定),用来标识哪些字段需要参与映射。例如:
// 用在字段上,表示该字段应被映射到目标结构(如数据库列、JSON 键等)
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.SOURCE) // 编译期使用,不保留到运行时
public @interface MapTo {
String value() default ""; // 映射的目标名,如 "user_name"
}
2. 编写注解处理器(Annotation Processor)
继承 AbstractProcessor,在 process() 方法中扫描被 @MapTo 标记的类和字段,然后生成映射逻辑代码(如 xxxMapper.java)。关键点:
- 用
RoundEnvironment获取所有带@MapTo的Element(通常是VariableElement字段) - 通过
Elements和Types工具类获取类名、包名、字段类型等元信息 - 用
Filer创建新的 Java 文件(如UserMapper.java),里面写死映射逻辑(如 setXXX() / getXXX() 调用) - 注意:不能在处理器里反射或实例化目标类(因为类还没编译完),只能基于 AST 信息生成代码
3. 生成的 Mapper 类完成实际映射逻辑
比如对如下类:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
public class User {
@MapTo("name")
private String userName;
@MapTo("age")
private int userAge;
}
注解处理器可生成:
public class UserMapper {
public static User fromMap(Map<string object> data) {
User u = new User();
u.userName = (String) data.get("name");
u.userAge = ((Number) data.get("age")).intValue();
return u;
}
public static Map<string object> toMap(User u) {
Map<string object> m = new HashMap();
m.put("name", u.userName);
m.put("age", u.userAge);
return m;
}
}</string></string></string>
这样调用方就无需手写映射,也不依赖运行时反射 —— 所有逻辑在编译期生成,安全且高效。
4. 注意与 Object 类的关系
Object 类在这里只起两个间接作用:
- 所有目标类(如
User)都隐式继承Object,因此能调用其基础方法(但映射本身不依赖它们) - 生成的 Mapper 方法参数/返回值若用
Object作为泛型擦除后的占位(如Map<string object></string>),是为兼容任意类型,但这属于 Java 泛型机制,不是Object主动参与映射
换句话说:Object 不提供映射能力,也不被注解处理器特殊处理;它是背景角色,不是驱动者。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










