Mam dziwny problem, którego nie mogę zrozumieć, który pojawił się podczas próby wtyczki do mojego programu. Dodatkowym problemem jest to, że nie jestem w stanie stworzyć prostego przypadku testowego, ponieważ za każdym razem, gdy go wypróbuję, działa. Muszę mieć pewne komplikacje, których mi brakuje. Ale postaram się opisać sytuację tak wyraźnie, jak to tylko możliwe, na wypadek gdyby brzmiał znajomo.Nie można uzyskać dostępu do chronionego elementu nadklasy z tego samego pakietu w innym słoju.
Mam klasę podstawową o nazwie Seed, która jest częścią aplikacji głównej i ładowana przez systemowy program ładujący klasy Mam wtyczkę zawierającą klasową Drogę, która jest podklasą Seed. Jest ładowany w środowisku wykonawczym z oddzielnego pliku jar. Droga klasy odwołuje się do pola Seed.garden, które jest zdefiniowane jako:
zabezpieczony końcowy ogród ogrodowy;
Pamiętaj, że nie dostaję błędów kompilacji. Nie otrzymuję również błędów runtime, gdy słoik wtyczki jest uwzględniony w systemowej ścieżce klas. Tylko wtedy, gdy moja główna aplikacja ładuje wtyczkę za pomocą nowego programu ładującego klasy (który ma systemowy program ładujący klasy jako obiekt nadrzędny), pojawia się błąd. Błąd jest:
java.lang.IllegalAccessError: próbował uzyskać dostęp do pola package.Seed.garden z klasy package.Road 4 $
To musi mieć coś wspólnego z faktem, że podklasa został załadowany przez inny program ładujący klasy niż nadklasa, ale nie mogę znaleźć żadnego oficjalnego powodu, dla którego to nie powinno działać. Podobnie jak powiedziałem, kiedy próbuję odtworzyć problem za pomocą prostego przypadku testowego (który obejmuje oddzielne słoiki, ładowanie podklasy innym programem ładującym klasy itp.), Nie otrzymuję błędu.
Nie wydaje się również prawdopodobne, że naruszam zasady dostępu, ponieważ działa, gdy klasy są ładowane przez ten sam program ładujący klasy i nie pojawiają się błędy kompilacji.
Brakuje mi pomysłów! Czy ktokolwiek rozpoznaje ten problem, czy może ma dla mnie wskazówki, na które należy zwrócić uwagę? Wsparcie!
Powinienem dodać, że droga 4 USD to anonimowa wewnętrzna klasa drogi (oczywiście), ale uwzględniłem ten fakt również w moim przypadku testowym i nadal działało. –
Możliwy duplikat opcji [Zastąpienie domyślnej metody dostępu dla różnych modułów ładujących klasy polimorfizm] (http://stackoverflow.com/questions/4060842/overriding-default-accessor-method-across-different-classloaders-breaks-polymorp) – axtavt
@axtavt: możesz mieć rację, chociaż artykuł dotyczy domyślnego dostępu, a nie chronionego dostępu. Myślę, że to samo dotyczy dostępu chronionego. Spojrzałem na specyfikację, ale nie złapałem "pakietu uruchomieniowego". Nie wyjaśnia, dlaczego mój przypadek testowy działa. Zobaczę, czy uda mi się złamać tę wiedzę. Dzięki! –