wtorek, marca 27, 2018

Jak wykryć, że ktoś nam zmienia klasy w JVM?

Ostatnio poprawiłem w DCEVM problem polegający na tym, że DCEVM nie updatował dla przeładowywanych klas pola classRedefindedCount...

Okazuje się, że Twórcy Java'y wpadli na pomysł tego by klasa dostarczała informacji o tym jak często jej zawartość była updatowana ;-)
Gdzie updatowanie oznacza zamianę kodu, albo pól (to w razie używania DCEVMa ;-)).

Żeby odczytać liczbę razy ile nasza klasa została zmieniona wystarczy użyć tej metody (za DCEVMem):

public static int getClassRedefinedCount(Class type) {
try {
Field field = Class.class.getDeclaredField("classRedefinedCount");
boolean accessibility = field.isAccessible();
field.setAccessible(true);
int classRedefinedCount = (Integer) field.get(type);
field.setAccessible(accessibility);
return classRedefinedCount;
} catch (Exception e) {
throw new RuntimeException(e);
}
}

Dzięki zawołaniu tej metody z naszym typem poznamy liczbę redefinicji naszej klasy ;-)

Metoda jak łatwo zobaczyć poprzez refleksje dociera do pola classRedefinedCount w Class i odczytuje jego wartość z instancji, którą jest nasz typ ;-) [rzadko się używa Class jako instancji ;-)]

Po co to komu?
Można by np. dodać kawałek do aplikacji, który skanuje wszystkie klasy i stwierdza czy np. ktoś apki nie debuguje i nie zmienia w locie ;-)

I jak na razie to jedyne zastosowanie na jakie wpadłem :-)

Ale mój pierwszy coś zrobiony w C++ już istnieje :-)


Podobne postybeta
Dodawanie i usuwanie metod i pól z klas Java w locie ;-)
PROPFIND, czyli jak przechytrzyć HttpURLConnection
Niecne wykorzystanie refleksji... czyli jak poszukać tekstu w drzewie obiektów? ;-)
Sztuczki tropiciela błędów, part 4
Ile to jest 1+1 w Java'ie?

Brak komentarzy:

Publikowanie komentarza