Mam obiekt Java o nieznanej strukturze. Teraz chcę wypisać tę strukturę (właściwości i ich wartości) do pliku dziennika. I oczywiście chcę to zrobić w trybie rekurencyjnym. Czy są jakieś biblioteki, które mogą mi pomóc?Jak rejestrować wewnętrzne obiekty dowolnego obiektu w Javie?
Odpowiedz
XStream jest niezmiernie dobra w drukowaniu wykresów obiektów, nawet w cyklach obsługi bez dodatkowej konfiguracji lub dodatkowego kodu w twoich klasach (tj. Bez zszywania z toString()). Po prostu dodaj bibliotekę i możesz to zrobić w dowolny sposób i uzyskać ładne, użyteczne wyjście:
log.debug("The object: {}", new XStream().toXML(anyObject));
To da ci wynik XML. Jeśli wolisz JSON, możesz uzyskać go z odrobiną więcej pracy, jak opisano w XStream JSON tutorial.
Serializacja Java, dostarczana z Javą, powinna wystarczyć. Będzie jednak w formacie binarnym.
Istnieje również serializacji XML, które mogą być świadczone przez JAXB
Proponuję spojrzeć zarówno na Apache Commons BeanUtils lub Apache Commons Lang, szczególnie ReflectionToStringBuilder.
można użyć refleksji
getClass a następnie przejść na każdej zmiennej instancji i przejść na (niektóre przedmioty mogą być traktowane specjalnie (jak smyczki))
Należy użyć odbicie. Spójrz na klasę java.lang.Class
, a konkretnie na metodę .getFields()
.
Znalazłem Apache Commons ToStringBuilder.reflectionToString()
bardzo przydatne. Aby uzyskać rekurencję, można przesłonić metodę ToString() każdego obiektu, wywołując tę funkcję, przekazując this
.
http://commons.apache.org/lang/api-2.6/org/apache/commons/lang/builder/ToStringBuilder.html
uważaj na cykle na wykresie obiektu ... –
The java reflection API da Ci dostęp do wszystkich tych rzeczy (prywatne członków i wszystkie). Aby uzyskać prywatnych członków, musisz uzyskać yourObject.getClass().getDeclaredFields()
, aby uzyskać dostęp do prywatnego pola, pamiętaj, aby zadzwonić pod numer yourField.setAccesible(true)
.
Oczywiście, bardzo szybko napotkasz problemy, radząc sobie z własną klasą, aby to zrobić poprzez odbicie. Główne problemy pojawiają się, gdy próbuje się zdecydować, aby ostatecznie wydrukować wartość i określić, czy jest to enum, prymitywny, prymitywny tablica i tak dalej. Możesz użyć metody Class.isPrimitive, aby dowiedzieć się, jak to zrobić. Aby uzyskać dostęp do elementów tablicy, użyj klasy java.lang.reflect.Array.
Najlepszą opcją, która została opublikowana wcześniej, jest użycie ReflectionToStringBuilder apache commons.
Serializator json wykona zadanie, np. przy użyciu Gson:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.gson.Gson;
...
private static final Logger LOG = LoggerFactory.getLogger(Your.class);
...
Object obj = ...;
LOG.info(new Gson().toJson(obj));
- 1. Pierwsze wewnętrzne Atrybuty obiektu LDAP
- 2. Jak programowo rejestrować PerformanceCounter
- 3. wewnętrzne jak scalić w lodas
- 4. Ile pamięci jest przydzielone dla jednego obiektu Integer w Javie? Jak znaleźć tę wartość dla dowolnego niestandardowego obiektu?
- 5. Jak rejestrować obiekty i tablice JavaScript w Winston, jak robi to plik console.log?
- 6. Jak przechwycić tworzenie obiektu w Javie
- 7. Jak powiązać ciąg do obiektu w Javie
- 8. Resetowanie obiektu Graphics2D w Javie
- 9. Przechowywanie dowolnego obiektu R na dysku twardym?
- 10. Jak usunąć wszystkie obiekty z obiektu NSMutableArray?
- 11. Obliczanie rozmiaru obiektu w Javie
- 12. C# rodzajowe ciąg analizowania do dowolnego obiektu
- 13. Niezmienne obiekty w Javie i dostęp do danych
- 14. Jak rejestrować wyjątki "catched"?
- 15. Jak sprawdzić, jakie obiekty zostały zebrane śmieci w Javie?
- 16. Jak wstrzyknąć zależności do dowolnego obiektu za pomocą Dagger2?
- 17. Jak działa metoda equals() w Javie
- 18. Jak rejestrować zawartość transakcji wiosennych?
- 19. Jak klonować obiekty w Scali?
- 20. Jak rejestrować aktywność połączenia JDBC?
- 21. Jak rejestrować skomplikowany proces synchronizacji?
- 22. Jak debugować/rejestrować aplikację WSGI?
- 23. Jak rejestrować odpowiedzi JSON w Dropwizard (Jersey)
- 24. Jak rejestrować zużycie pamięci w systemie Linux?
- 25. Jak rejestrować instrukcje SQL w Dropwizard
- 26. Jak rejestrować tekst wielowierszowy w Logback/SLF4J?
- 27. Jak rejestrować nieobsłużone wyjątki w ASP.NET MVC?
- 28. Jak rejestrować wszystkie nagłówki w nginx?
- 29. Jak przekazywać obiekty w EventArgs
- 30. Jak klonować obiekty w NHibernate?
Czy uważasz, że format binarny jest odpowiedni do pliku dziennika? :) – yegor256
Dobra uwaga. Właśnie dodałem link do JAXB. –