Mam klasę i chcę znaleźć wszystkie jej pola publiczne (nie metody). Jak mogę to zrobić?
Dzięki!
java
reflection
ufk
źródło
źródło
Odpowiedzi:
zwraca tablicę wszystkich publicznych zmiennych klasy.
getFields()
zwróć pola w całej dziedziczeniu klasowym. Jeśli chcesz, aby pola były zdefiniowane tylko w danej klasie, a nie w jej nadklasach, użyjgetDeclaredFields()
i filtruj polapublic
, stosując następująceModifier
podejście:YourClassName.class
Dosłowne faktycznie reprezentuje obiekt typujava.lang.Class
. Sprawdź jego dokumentację, aby znaleźć bardziej interesujące metody refleksji.Powyższa
Field
klasa tojava.lang.reflect.Field
. Możesz rzucić okiem na całyjava.lang.reflect
pakiet.źródło
https://docs.oracle.com/javase/tutorial/reflect/class/classMembers.html zawiera również wykresy do lokalizowania metod i konstruktorów.
źródło
Możesz użyć dowolnego z dwóch w zależności od potrzeb:
Field[] fields = ClassName.class.getFields(); // returns inherited members but not private members. Field[] fields = ClassName.class.getDeclaredFields(); // returns all members including private members but not inherited members.
Aby odfiltrować tylko pola publiczne z powyższej listy (na podstawie wymagań) użyj poniższego kodu:
źródło
Jak wspomniało kilku użytkowników, poniższy kod może pomóc znaleźć wszystkie pola w danej klasie.
TestClass testObject= new TestClass().getClass(); Method[] methods = testObject.getMethods(); for (Method method:methods) { String name=method.getName(); if(name.startsWith("get")) { System.out.println(name.substring(3)); }else if(name.startsWith("is")) { System.out.println(name.substring(2)); } }
Jednak bardziej interesujące podejście jest poniżej:
Z pomocą biblioteki Jacksona udało mi się znaleźć wszystkie właściwości klas typu String / integer / double i odpowiednie wartości w klasie Map. ( bez używania interfejsu API odbić! )
TestClass testObject = new TestClass(); com.fasterxml.jackson.databind.ObjectMapper m = new com.fasterxml.jackson.databind.ObjectMapper(); Map<String,Object> props = m.convertValue(testObject, Map.class); for(Map.Entry<String, Object> entry : props.entrySet()){ if(entry.getValue() instanceof String || entry.getValue() instanceof Integer || entry.getValue() instanceof Double){ System.out.println(entry.getKey() + "-->" + entry.getValue()); } }
źródło