1. 需求:
Java把对象的属性写入文本文件
问题来源:百度贴吧
2. 分析:
问题的解决方法有多种,比如:让 POJO 继承或者实现某个接口,实现某个方法,然后再调用即可。
假设有种情况,初期没有考虑这个使用场景,后期或者用户反馈需要增加该需求,改动已有代码,还需要重新测试,最好的情况就是在不改动原来POJO代码的情况下,实现该需求。
如何做到?
不同的类有不同的属性字段,又要统一接口实现,自然会想到强大的反射机制,配合泛型,实现起来不难。
- 存在某个类对象, Test test
- 获取类对象 Class<?> testClass = test.getClass()
- 获取所有属性 ,比如 testClass.getDeclaredFields()
- 迭代每个属性,获取属性名称 field.getName() ,“userName”
- 获取属性的getter Method, 比如 testClass.getMethod(“get” + “UserName”)
- 通过Method.invoke(test) 获取到getter返回的值
没有什么复制的业务逻辑,只要有反射的概念就行。
注意getter方法名的驼峰命名法,属性名首字母转大写, 封装成一个工具类,方便调用,在业务层添加调用的代码即可。
3. 代码
package com.company;
import java.lang.reflect.*;
public class Main {
public static void main(String[] args) {
Test test = new Test("hello", 100);
SerialTextUtil.doSerialText(test);
}
}
class Test {
private String userName;
private Integer age;
public Test(String userName, Integer age) {
this.userName = userName;
this.age = age;
}
public String getUserName() {
return userName;
}
public Integer getAge() {
return age;
}
}
class SerialTextUtil {
public static <T> void doSerialText(T test) {
Class<?> testClass = test.getClass();
System.out.print(testClass.getSimpleName() + " : ");
for (Field field : testClass.getDeclaredFields()) {
System.out.print(field.getName() + " = ");
try {
Method method = testClass.getMethod("get" + upperCase(field.getName()));
System.out.print(method.invoke(test) + " , ");
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println();
}
public static String upperCase(String str) {
char[] ch = str.toCharArray();
if (ch[0] >= 'a' && ch[0] <= 'z') {
ch[0] = (char) (ch[0] - 32);
}
return new String(ch);
}
}
运行结果:
Test : userName = hello , age = 100 ,
有了类名称,以及属性的值,大概就可以写入Test.txt 中了吧。