java引⽤赋值和直接赋值_【Java】请问⽅法引⽤之后如何赋
值
我现在想实现这种的效果
Beanutils.setProperty1(user, User::getName);
我参照⽹上的例⼦定义了⼀个接⼝类
@FunctionalInterface
public interface FunctionOperation extends Serializable {
//这⾥只接收⽆参⽅法
Object get(T source);
//这个⽅法返回的SerializedLambda是重点
default SerializedLambda getSerializedLambda() throws Exception {
/
jdk怎么使用/writeReplace改了好像会报异常
Method write = Class().getDeclaredMethod("writeReplace");
write.setAccessible(true);
return (SerializedLambda) write.invoke(this);
}
default String getImplClass() {
try {
return getSerializedLambda().getImplClass();
} catch (Exception e) {
return null;
}
}
default String getImplMethodName() {
try {
return getSerializedLambda().getImplMethodName();
} catch (Exception e) {
return null;
}
}
定义了实现⽅法
public static Object setProperty1(Object object, FunctionOperation a) {
try{
}catch (Exception e){
e.printStackTrace();
}
return object;
}
我在这⾥边如何操作,其他服务调⽤这个⽅法的时候
Beanutils.setProperty1(user, User::getName);
当我这么调⽤的时候,我希望在上边那个实现⽅法⾥给这个name赋值⽐如说 “aaa”,但是我使⽤反射的⽅法好像没有成功,想问⼀下⼀般都是如何处理
修改:
我没有表述清楚我的想法,我现在有两个⽅法,这两个⽅法我希望实现的功能是⼀样的
public static Object setProperty(Object object,String a,String b) {
Class target = Class();
try{
PropertyDescriptor descriptor = new PropertyDescriptor(a,target);
Method method= WriteMethod(); //
method.invoke(object,"1");
PropertyDescriptor descriptor2 = new PropertyDescriptor(b,target);
Method method2= WriteMethod(); //
method2.invoke(object,"1");
}catch (Exception e){
e.printStackTrace();
}
return object;
}
public static Object setProperty1(Object object, FunctionOperation a,FunctionOperation b) {
try{
}catch (Exception e){
e.printStackTrace();
}
return object;
}
我在controller调⽤了这两个⽅法
public static void main(String[] args) {
User user = new User();
user.setAge("1111");
System.out.String());
try {
Beanutils.setProperty(user,"name","age");
//想采⽤这种⽅式
Beanutils.setProperty1(user, User::getName,User::getAge);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println(user);
}
⼀种格式是
Beanutils.setProperty(user,”name”,”age”)
传递字符串这种,我希望可以传递User::getName这种,也就是下边这样
Beanutils.setProperty1(user, User::getName,User::getAge);
我尝试在setProperty1⽅法⾥也是⽤setProperty⽅法⾥的那种invoke但是好像没有效果。就卡住了我也不知道该怎么处理了
回答
看来后续的补充才算明⽩setProperty1只是为了设置默认的属性值,其实题主你之前写这个User::getName,User::getAge对我影响太⼤了,我⽼想到get操作去,你这个不是赋值,所以应该是set操作嘛
这个⽅法引⽤,其实就是lambda表达式嘛,⽅法引⽤只是快捷写法,那lambda表达式其实就是把⽅法做了抽象
⽽⼀个⽅法是需要关⼼输⼊和输出的,那lambda表达式也需要关注输⼊和输出。
题主想要setProperty1⽅法和setProperty效果⼀样,所以setProperty1⽅法中的参数传⼊的lambda表达式应该也要做到给属性赋值的操作。
那这个lambda表达式的输⼊是什么?
setProperty1⽅法中能给到的是参数有object对象以及默认的输⼊值"1",所以传⼊的lambda表达式的输⼊就应该是object和"1",返回可以为空,因为这个lambda表达式⾥我只对某个属性做设置操作就可以了
那我们jdk中提供了有没有根据两个参数做操作,但是返回void的FunctionalInterface呢?当然有的,那就是BiComsumer
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论