可是上面的示例仍然需要手动输入"name"来获取属性的名称,能够改进下用lambda的形式如Person::getName来获取吗
时间: 2024-04-15 22:29:25 浏览: 18
是的,你可以使用Lambda表达式结合反射来获取属性的名称,而不是手动输入属性名。以下是一个示例代码:
```java
import java.lang.reflect.Field;
import java.util.function.Supplier;
public class Main {
public static void main(String[] args) {
Person person = new Person("John");
Supplier<String> getName = () -> getProperty(person, Person::getName);
System.out.println(getName.get()); // 输出 "name"
}
public static <T> String getProperty(T obj, Supplier<?> supplier) {
try {
Field field = obj.getClass().getDeclaredField(supplier.get().toString());
return field.getName();
} catch (NoSuchFieldException e) {
e.printStackTrace();
}
return null;
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
}
```
在上述示例中,我们定义了一个`getProperty()`方法,该方法接收一个对象和一个返回属性值的Supplier函数式接口作为参数。在`getProperty()`方法中,我们首先获取Supplier返回的属性值,然后使用反射获取该属性的Field对象,最后返回字段的名称字符串。
在主方法中,我们使用Lambda表达式`Person::getName`作为Supplier函数式接口的实现来获取属性值。然后,将这个Supplier传递给`getProperty()`方法来获取属性的名称。
这样,你就可以通过Lambda表达式的方式来动态获取属性的名称,而不需要手动输入属性名。