Java反射用例:

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 中了吧。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值