为什么要使用反射举例
有时候不用反射代码根本写不下去,举个例子:
场景再现
用户传上来一段 完全动态的 JSON:
{"userName":"Tom","age":18,"email":"tom@x.com"}
你的类:
class Person {private String userName;private int age;private String email;// 省略 getter/setter
}
一、用“正规手段”写死行不行?
// 正规代码:编译期就把方法名写死
if (json.has("userName")) {person.setUserName(json.getString("userName"));
}
if (json.has("age")) {person.setAge(json.getInt("age"));
}
if (json.has("email")) {person.setEmail(json.getString("email"));
}
看起来可以,但问题来了:
-
字段个数/名字一变就要改代码
明天加 “address”、后天加 “phone”,你还得重新编译整个程序。 -
字段类型可能是任意嵌套对象
{"dept":{"id":1,"name":"RD"}}
你得再写一段:
if (json.has("dept")) {JSONObject d = json.getJSONObject("dept");Dept dept = new Dept();dept.setId(d.getInt("id"));dept.setName(d.getString("name"));person.setDept(dept);
}
无限嵌套 → 代码爆炸。
二、用反射的“魔法”怎么做?
// 这段代码**永远不需要改**,不管 JSON 里突然多出多少字段
Class<?> clazz = Person.class;
Object obj = clazz.newInstance();for (String key : json.keySet()) {// 1. 把字段名变成 setter 方法名String setter = "set" + key.substring(0,1).toUpperCase() + key.substring(1);// 2. 根据字段类型拿到方法对象Method m = clazz.getMethod(setter, deduceType(json, key));// 3. invoke 调用m.invoke(obj, json.get(key));
}
- 字段名、类型、嵌套层级全部运行时动态推断;
- 新增/删除字段 → 零代码改动;
- 任何类都能复用这一段逻辑,这就是 Jackson/Fastjson 的核心。
