javabean链式调用优雅通用属性赋值法

【问题】如何使用类的同一个方法给该类的属性赋值(例如val方法)?

1、首先定义一个实现Serializable的函数式接口

@FunctionalInterface
public interface SerializeFunction<T, R> extends Serializable {

    R apply(T t);
}

2、定义一个常量工具类,通过反射方式赋值

public class ReflectUtils {

    public static <T> T val(T obj, SerializeFunction<T, ?> func, Object value) {
        try {
            Method writeReplace = func.getClass().getDeclaredMethod("writeReplace");
            writeReplace.setAccessible(true);
            SerializedLambda serializedLambda = (SerializedLambda)writeReplace.invoke(func);
            String fieldName = Introspector.decapitalize(serializedLambda.getImplMethodName().replace("get", ""));
            ReflectUtil.setFieldValue(obj, fieldName, value);
        } catch (Exception e) {
            LoggerUtil.warn("执行通用赋值方法失败");
        }
        return obj;
    }

}

3、定义一个通用接口和默认赋值方法,用于普通javabean类实现该接口

public interface ValEntity<T> {

    default <T> T val(SerializeFunction<T, ?> func, Object value){
        return ReflectUtils.val((T)this, func, value);
    }
}

【测试】定义一个普通javabean对象实现ValEntity接口,并编写测试类的main方法进行测试。

public class TestBean implements ValEntity<TestBean> {

    private Integer id;
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    @Override
    public String toString() {
        return new StringJoiner(", ", TestBean.class.getSimpleName() + "[", "]").add("id=" + id).add("name='" + name + "'")
            .toString();
    }
}
public class Test {

    public static void main(String[] args) {

        TestBean obj = new TestBean();

        obj.val(TestBean::getId, 666).val(TestBean::getName, "小明");

        System.out.println(obj.toString());
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值