java reflexión específica get valor del campo declarada como cadena

Lokeshkumar R:

Estoy teniendo un campo declarado en RequestDto como (requestDto tiene muchos campos declarados pero quiero solamente este campo personalizado)

private String custom; 

quería conseguir esta declarada personalizada nombre del campo como cadena

me gusta String name-"custom"(but custom has to be dynamic)

La solución tiene que ser sin modificar captadores y definidores por defecto

En realidad tengo un problema como cuando un requestDto se procesa para la validación del contenido si uno de los campos en la solicitud Dto está teniendo un mal los datos que debería proporcionar un mensaje de error, junto con el nombre del campo como cadena que tenía un conjunto de datos irrelevantes

El problema es cuando el campo personalizado se modifica en RequestDto en el futuro, la persona modificarlo ni siquiera se puede saber que el campo personalizado se configura como una cadena y se utiliza, así que quería tener el nombre del campo personalizado como cadena de RequestDto única, por lo cuando cada vez que se cambia el valor del campo me sale el nombre cambiado en cadena

Roland:

Editar: después de haber añadido la pieza más importante de información en el comentario "¿y si alguien cambia ese nombre en el futuro" ... bueno ... entonces la reflexión no es el camino a seguir!

Entonces yo preferiría usar algo así como una Function<RequestDto, String>o similar en lugar, por ejemplo:

static String getCustom(RequestDto requestDto, Function<RequestDto, String> customExtractor) {
  return customExtractor.apply(requestDto);
}

y llamarlo a través de:

RequestDto someRequest = ...;
getCustom(someRequest, RequestDto::getCustom);

Si ese campo se refactorizado en el futuro esa parte será rediseñado también a continuación de forma automática (bueno ... depende de su IDE probablemente ;-)). Pero ... no le dará el nombre de campo apropiado como mensaje de error. Tenga en cuenta que no es una buena manera de coger el campo de la derecha, si la única propiedad de conseguirlo, es su nombre. Si desea poner una anotación para el campo, que podría luego filtrar y agarrar el campo con esa específica anotación. De esa manera usted no necesita saber el nombre real ... pero contrapregunta: ¿cómo se puede estar seguro de que sólo 1 campo es anotado con la anotación? Yo prefiero que rediseñar parte específica de su aplicación. No lo exponga cualquier campo para el "cliente". Si eso significa que tengo potencialmente diferentes nombres en el mensaje de error y los nombres de los campos, que así sea.

Tenga en cuenta también que los IDE modernas que permiten a las cadenas Refactor también (al cambiar el nombre de un campo). Sólo tiene que asegurarse de que esta información se propaga a través del equipo de entonces (y también los futuros miembros).


respuesta anterior utilizando la reflexión:

Si con la dinámica que quiere decir, que debe comenzar con ese nombre o que contengan ese nombre, es posible que desee usar algo de la siguiente manera, es decir, getDeclaredFields()e iterar sobre ellos para filtrar los campos interesados:

private static String getCustom(RequestDto requestDto) throws NoSuchFieldException, IllegalAccessException {
    return Arrays.stream(requestDto.getClass().getDeclaredFields())
            .filter(e -> e.getName().startsWith("custom"))
            .findFirst() // if the first match suffices
            .map(f -> {  // you may want to extract that part if you use streams
                f.setAccessible(true);
                try {
                    return (String) f.get(requestDto);
                } catch (IllegalAccessException e) {
                    // TODO whatever you need to do...
                    return null;
                }
            }).orElseThrow(IllegalArgumentException::new); // or whatever suites better
}

Esta muestra debe ser suficiente en caso de que necesite para filtrar por tipo o por anotación, etc Sólo adaptar el filtro a continuación, en consecuencia.

Si es sólo el nombre de un campo que necesita, es Field.getName()lo que desea.

Supongo que te gusta

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