Ho uno strano problema che non riesco a capire quando ho cercato di estrapolare il mio programma. Un ulteriore problema è che non sono in grado di creare un semplice caso di test, perché ogni volta che provo funziona. Ci deve essere qualche complicazione che mi manca. Ma cercherò di descrivere la situazione nel modo più chiaro possibile, nel caso in cui suoni familiare a chiunque.Impossibile accedere al membro protetto della superclasse dallo stesso pacchetto in un diverso contenitore
Ho una classe base chiamata Seed che fa parte dell'applicazione principale e viene caricata dal classloader di sistema. Ho un plugin che contiene una classe Road che è una sottoclasse di Seed. Viene caricato in fase di runtime da un file jar separato. La classe Road fa riferimento al campo Seed.garden, che è definito come:
giardino finale protetto;
Nota che non ottengo errori di compilazione. Inoltre, non ricevo errori di runtime quando il jar del plug-in è incluso nel classpath del sistema. Solo quando la mia applicazione principale carica il plug-in usando un nuovo classloader (che ha il programma di caricamento di sistema come genitore) ottengo l'errore. L'errore è:
java.lang.IllegalAccessError: tentato di accedere campo package.Seed.garden dalla classe package.Road $ 4
Deve avere qualcosa a che fare con il fatto che la sottoclasse è stato caricato da un caricatore di classe diverso rispetto alla superclasse, ma non riesco a trovare alcun motivo ufficiale per cui ciò non dovrebbe funzionare. Inoltre, come ho detto, quando provo a riprodurre il problema con un semplice caso di test (che include i vasi separati, caricando la sottoclasse con un diverso programma di caricamento classi, ecc.), Non ottengo l'errore.
Inoltre, non sembra probabile che io stia violando le regole di accesso poiché funziona quando le classi vengono caricate dallo stesso classloader e non ottengo errori di compilazione.
Sono fuori di idee! Qualcuno riconosce questo problema, o ha qualche indicazione per me per le indicazioni su cui guardare? Aiuto!
Dovrei aggiungere che Road $ 4 è una classe interna anonima di Road (ovviamente), ma ho incluso questo fatto nel mio caso di test, e ha funzionato ancora. –
possibile duplicato di [Sovrascrivere il metodo di accesso predefinito tra diversi classloader rompe il polimorfismo] (http://stackoverflow.com/questions/4060842/overriding-default-accessor-method-across-different-classloaders-breaks-polymorp) – axtavt
@axtavt: potresti avere ragione, sebbene quell'articolo riguardi l'accesso predefinito, non l'accesso protetto. Suppongo che lo stesso valga per l'accesso protetto. Ho dato un'occhiata alle specifiche, ma non ho capito la cosa del "pacchetto di runtime". Non spiega perché il mio caso di test funziona. Vedrò se riesco a farlo rompere usando questa conoscenza. Grazie! –