gpt4 book ai didi

java - 我怎样才能得到一个特定的方法名称作为字符串而不是硬编码方法名称

转载 作者:塔克拉玛干 更新时间:2023-11-01 23:01:12 24 4
gpt4 key购买 nike

我必须通过 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); }

假设我有一个类

 @Getter
@Setter
Class Student{
String studentName;
String address;
int rollNumber;
}

比方说,我们有调用者代码

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"));

不是将硬编码的方法名称作为参数传递给 getAttribute() 方法,有没有一种方法可以使用未硬编码的方法名称?

例如,getAttribute(student, Student.class.name(), Student.class.getStudentName.getName()) 这样我们就可以很容易的对student的方法和变量进行修改类在需要时不用担心硬编码的方法名称常量。

最佳答案

要找到集合中对象的给定 getter 的第一个非空结果,您可以利用流、方法引用和可选值,同时完全避免反射。

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();
}

用法示例: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]
}
}

注意:这些是 Java 8 的功能。

关于java - 我怎样才能得到一个特定的方法名称作为字符串而不是硬编码方法名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51723259/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com