【问题】如何使用类的同一个方法给该类的属性赋值(例如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());
}
}