Java 8 introduce o modificare de comportament pentru codul care utilizează
metodele Proxy.getProxyClass şi Constructor.newInstance
pentru a crea o instanţă proxy dacă apelantul nu este în acelaşi pachet de rulare cu
interfaţa proxy non-publică.
În Java 7, utilizarea acestor metode creează clasa proxy. În Java 8, eşuează cu o
IllegalAccessException.
Deoarece analizorul nu poate întotdeauna determina interfeţele care sunt utilizate sau vizibilitatea lor,
această regulă semnalează toate invocările Constructor.newInstance(InvocationHandler) cu excepţia cazurilor când
sunt definite ca accesibile. Regula nu semnalează invocările metodei
Constructor.newInstance(InvocationHandler) care sunt precedate în aceeaşi metodă
cu apeluri la următoarele metode:
Proxy.getProxyClass(ClassLoader, Class...) care defineşte interfeţele ca literali de tip accesibilConstructor.setAccessible(true)
Inspectaţi codul semnalat pentru a vedea dacă metoda getProxyClass este apelată din alte pachete de runtime dacă o
interfaţă proxy este non-publică. De exemplu, o interfaţă la nivel de pachet care nu are
cuvântul cheie public este non-publică.
Pentru a crea o clasă proxy în Java 8, utilizaţi una dintre următoarele tehnici:
Constructor.setAccessible(true) pentru a seta steguleţul accesibil. Proxy.newProxyInstance.
Dacă este prezent un manager de securitate, ambele soluţii au nevoie de permisiunea ReflectPermission("newProxyInPackage.{nume pachet}")
pentru a evita o SecurityException.
Următorul exemplu arată cum puteţi modifica codul dacă metoda proxyClass
instanţiază o interfaţă non-publică:
Pentru informaţii suplimentare, consultaţi documentaţia Java pentru următoarele clase: