Eu tenho que chamar um método particular através da reflexão Java. Em vez de passar o nome do método codificado, é possível passar o nome do método como uma string?
Por exemplo
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); }
Digamos que eu tenha uma classe
@Getter
@Setter
Class Student{
String studentName;
String address;
int rollNumber;
}
Vamos dizer, temos código chamador
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"));
Em vez de passar o nome do método codificado como parâmetro para getAttribute()
método, existe uma maneira que eu possa usar um nome de método que não é codificado?
Por exemplo, getAttribute(student, Student.class.name(), Student.class.getStudentName.getName())
de modo que podemos facilmente fazer as alterações para métodos e variáveis da classe estudante quando necessário, sem se preocupar em constantes nome método codificadas.
Para encontrar o primeiro resultado não nulo de um determinado getter dos objetos em uma coleção, você poderia utilizar correntes, referências de métodos, e opcionais, evitando reflexão inteiramente.
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();
}
Exemplo de utilização: 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]
}
}
Nota: estes são Java 8 características.