如何将特定方法名称作为字符串而不是硬编码方法名称

Gan*_*ula 3 java reflection

我必须通过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())这样我们可以在需要时轻松地对学生类的方法和变量进行更改,而无需担心硬编码的方法名称常量.

FTh*_*son 5

要查找集合中对象的给定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功能.