Obter lista de classes a partir de um objeto em java

Panos K:

Iam actualmente a tentar criar uma distinta List<Class> classListque contém todas as Classes de um objecto, por exemplo,

DemoObject.java

public class DemoObject {

    private Integer id;
    private String name;
    private BigDecimal price;
    private Boolean isActive;
    private List<NestedDemoObject> nested;
}

NestedDemoObject.java

public class NestedDemoObject {

    private Integer id;
    private String nameNest;
    private Boolean isActive;
}

O que eu quero criar é um método public List<Class> getDistinctClasses(Class cl);que você dá como entrada, por exemplo, DemoObject.classe retorna uma lista com

[DemoObject.class, Integer.class, String.class, BigDecimal.class, Boolean.class, List.class, NestedDemoObject.class]

Outro exemplo NestedDemoObject.classseria

[NestedDemoObject.class, Integer.class, String.class, Boolean.class]

Eu tentei usar a .getDeclaredClasses()partir Classsem qualquer sorte. Existe alguma maneira de obter todas as classes aninhadas de um objeto com reflexão API?

Qualquer ajuda ou direcção apreciado.

ETO:

A solução fornecida por Mark é parcialmente correcta. Você está no caminho certo tentar recuperar as classes de campos declarados. No entanto getType()método não revelar os tipos genéricos.

Para acessar os tipos genéricos que você deve usar Field.getGenericType()em seu lugar. Ele retorna as classes como Typeobjetos. Os Fieldobjetos SEI seus próprios tipos (eles não são apagadas como se pode acreditar erroneamente). Esta é uma java 1.8+ exemplo imprimir os tipos com os genéricos:

Arrays.stream(DemoObject.class.getDeclaredFields())
            .map(Field::getGenericType)
            .map(Type::getTypeName)
            .distinct()
            .forEach(System.out::println);

Ele irá imprimir o seguinte resultado:

java.lang.Integer
java.lang.String
java.math.BigDecimal
java.lang.Boolean
java.util.List<com.eto.sandbox.NestedDemoObject>

Se você quiser jogar com tipos genéricos ou analisá-los por qualquer razão, então você pode usar este exemplo:

 Arrays.stream(DemoObject.class.getDeclaredFields())
            .map(Field::getGenericType)
            .distinct()
            .forEach(type -> {
                if (type instanceof Class) {
                    // This is a simple class
                } else if (type instanceof ParameterizedType) {
                    // This is a generic type. You can parse its parameters recursively.
                }
            });

Acho que você gosta

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