Como posso obter o nome do método particular, como cadeia em vez de codificar um nome de método

Gangadhar Enagandula:

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.

FThompson:

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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=202895&siteId=1
Recomendado
Clasificación