我必须通过Java反射调用一个特定的方法.而不是传递硬编码的方法名称,是否可以将方法名称作为字符串传递?
例如
public String getAttribute(Object object1, Object2, String className, String methodName){
Class<?> clazz = Class.forName(className);
Method method = clazz.getMethod(methodName);
return ObjectUtils.firstNonNull(null == object1 ? null: method.invoke(object1),null == object2 ? null: method.invoke(object2); }
Run Code Online (Sandbox Code Playgroud)
我们说我上课了
@Getter
@Setter
Class Student{
String studentName;
String address;
int rollNumber;
}
Run Code Online (Sandbox Code Playgroud)
可以说,我们有来电代码
Student student1 = new Student();// Student record from School 1
Student student2 = new Student(); // Student record from School 2
student2.setAddress("ABC");
System.out.println(getAttribute(student1, student2, Student.class.name(), "getAddress"));
Run Code Online (Sandbox Code Playgroud)
而不是将硬编码的方法名称作为参数传递给getAttribute()方法,有没有办法可以使用非硬编码的方法名称?
例如,getAttribute(student, Student.class.name(), Student.class.getStudentName.getName())这样我们可以在需要时轻松地对学生类的方法和变量进行更改,而无需担心硬编码的方法名称常量.
要查找集合中对象的给定getter的第一个非null结果,您可以使用流,方法引用和可选项,同时完全避免反射.
public static <T, R> Optional<R> findFirstNonNull(Collection<T> objects,
Function<T, R> getter) {
return objects.stream()
.filter(Objects::nonNull)
.map(getter)
.filter(Objects::nonNull)
.findFirst();
}
Run Code Online (Sandbox Code Playgroud)
用法示例: Optional<String> found = findFirstNonNull(fooList, Foo::getName);
public class Foo {
private String name;
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
public static void main(String[] args) {
Foo foo1 = null;
Foo foo2 = new Foo();
Foo foo3 = new Foo();
foo3.setName("foo3");
Foo foo4 = new Foo();
foo4.setName("foo4");
List<Foo> fooList = Arrays.asList(foo1, foo2, foo3, foo4);
Optional<String> found = findFirstNonNull(fooList, Foo::getName);
System.out.println(found); // Optional[foo3]
}
}
Run Code Online (Sandbox Code Playgroud)
注意:这些是Java 8功能.
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |