es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo obtener el tipo de la clase de implementación almacenada en la variable declarada en el tipo de interfaz mediante la reflexión de Java?

¿Cómo puedo obtener el tipo de la clase de implementación almacenada en la variable declarada en el tipo de interfaz mediante reflexión en Java?

Si verifica el tipo de variable de lista declarada como tipo “List” utilizando “getDeclaredField()”, se obtendrá como List.

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

public class Test {

private static List<string> list = new ArrayList<>();

public static void main(String[] args) throws Exception {
    Field f = Test.class.getDeclaredField("list");
    String type = f.getType().getSimpleName();
    System.out.println(type); //output "List"
}

}

¿Existe alguna manera de obtenerlo como un ArrayList?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible obtener el tipo de la clase de implementación almacenada en la variable declarada en el tipo de interfaz como un objeto ArrayList, utilizando la reflexión de Java. Una forma de lograr esto es llamando al método getGenericType() en el objeto Field, que devuelve un objeto Type que representa el tipo declarado del campo. Luego, podemos convertir este objeto en un ParameterizedType, que proporciona acceso a los argumentos de tipo reales del tipo parametrizado. Por último, podemos recuperar el primer argumento de tipo, que representa el tipo de los elementos almacenados en la lista, y convertirlo en un objeto Class. Aquí tienes un ejemplo:

    import java.lang.reflect.Field;
    import java.lang.reflect.ParameterizedType;
    import java.util.ArrayList;
    import java.util.List;
    
    public class Test {
    
        private static List<string> lista = new ArrayList<>();
    
        public static void main(String[] args) throws Exception {
            Field f = Test.class.getDeclaredField("lista");
            Type tipo = f.getGenericType();
            if (tipo instanceof ParameterizedType) {
                ParameterizedType tipoParametrizado = (ParameterizedType) tipo;
                Type[] argumentosTipo = tipoParametrizado.getActualTypeArguments();
                if (argumentosTipo.length > 0 && argumentosTipo[0] instanceof Class) {
                    Class<?> claseElemento = (Class<?>) argumentosTipo[0];
                    System.out.println(claseElemento.getSimpleName()); // resultado "String"
                }
            }
        }
    }
    

    En este ejemplo, primero obtenemos el GenéricoTipo del campo y verificamos si es una instancia de ParameterizedType, lo cual indica que el tipo de la variable es un tipo parametrizado (en este caso, una lista). Luego obtenemos los argumentos de tipo reales del tipo parametrizado, que deberían contener el argumento de tipo de la lista, en este caso String. Verificamos si el array no está vacío (en caso de un tipo sin parámetros) y si el primer argumento de tipo es una clase, luego obtenemos su nombre simple. La salida del código de ejemplo debería ser String, que es el tipo de los elementos almacenados en la lista.

Comments are closed.