Używam adnotacji do dynamicznego ustawiania wartości pól w klasach. Ponieważ chcę to zrobić niezależnie od tego, czy jest to publiczne, chronione czy prywatne, za setAccessible(true)
każdym razem przed wywołaniem set()
metody wywołuję obiekt Field . Moje pytanie brzmi: jaki wpływ ma to setAccessible()
wezwanie na samo pole?
Mówiąc dokładniej, powiedzmy, że jest to pole prywatne i ten zestaw wywołań kodu setAccessible(true)
. Gdyby jakieś inne miejsce w kodzie miało następnie pobrać to samo pole poprzez refleksję, czy to pole byłoby już dostępne? A może metody getDeclaredFields()
i getDeclaredField()
zwracają za każdym razem nowe wystąpienia obiektu Field?
Wydaje mi się, że innym sposobem zadawania pytania jest to, że jeśli zadzwonię setAccessible(true)
, jak ważne jest, aby przywrócić pierwotną wartość po zakończeniu?
źródło
throws Exception
także uchwytyNoSuchFieldException
, ale możesz zająć się tym w bardziej wyszukany sposób.getDeclaredField
Metoda ma powrócić nowego obiektu za każdym razem, właśnie dlatego, że obiekt ten ma zmiennyaccessible
flagę. Nie ma więc potrzeby resetowania flagi. Wszystkie szczegóły znajdziesz w tym poście na blogu .źródło
Jak wskazały inne plakaty,
setAccessible
ma zastosowanie tylko do tego wystąpieniajava.lang.reflect.Field
, więc przywracanie dostępności do pierwotnego stanu nie jest potrzebne.Jednak...
Jeśli chcesz, aby wywołania
field.setAccessible(true)
były trwałe, musisz użyć podstawowych metod wjava.lang.Class
ijava.lang.reflect.Field
. Publiczność stoi metod wysłać kopie naField
przykład, więc „zapomina” po każdym razem zrobić coś podobnegoclass.getField(name)
Aktualizacja : ta implementacja jest przeznaczona dla Java 8, przyszłe wersje zmieniają zaplecze, co to zepsuje. Ta sama koncepcja ma jednak nadal zastosowanie, jeśli naprawdę chcesz kontynuować tę strategię.
źródło
źródło