2011-10-31 14 views
5

Sto provando a caricare una classe tramite URLClassLoader (beh, non funziona con un normale programma di caricamento classi) e voglio che non abbiano alcun permesso.Errore di autorizzazione di Java Reflection

Pertanto, ho creato il mio gestore della sicurezza, che genera una chiave all'avvio, che può essere richiesta solo una volta (nel thread principale). Il responsabile della sicurezza ha 2 elenchi, il thread dell'applicazione, a cui verranno assegnati tutti i diritti e la lista temporanea, a cui verrà concesso un diritto una volta sola (riguarda il riflesso).

Poiché è molto difficile da descripe, ho deciso di caricare il tutto: un'occhiata al link qui sotto

Ok, ritorno: ho creato un filo WatchDog, che controlla se il thread non lo fa prendi troppo tempo

Quando ora inizio ad istanziare due classi da un URLClassLoader, chiamo esattamente 30 metodi senza ottenere errori, ma alla 31a chiamata, prova a verificare le Permissioni per quanto segue, ma questo è solo dopo la 30a chiamata.

 
java.lang.RuntimePermission accessClassInPackage.sun.reflect), 

Qualcuno sa cosa sta succedendo lì?

modifica: Ho avuto il tempo di eliminare l'esempio. http://myxcode.at/securitymanager.zip Ho scoperto che SecurityManager non viene richiesto sincrono. Basta eseguire questo piccolo pezzo di codice e dare un'occhiata alle linee rosse.

Se le linee rosse arrivano nella prima riga, esegui nuovamente il programma, scoprirai che sembra un po 'incontrollato.

Il problema più o meno è che ho bisogno che il responsabile della sicurezza sia sincronizzato. Qui è la mia uscita per coloro che non possono affrontare l'errore (bug?) http://pastebin.com/E9yLRLif

EDIT2: forse la sua sulla console? forse la console è troppo lenta?

+2

Lessare il vostro problema fino ad una piccola, conciso, esempio completo e post qui. –

+1

ok, eccolo;) –

risposta

4

Per me si verifica il controllo quando i=15:

checkPermission ((java.lang.RuntimePermission accessClassInPackage.sun.reflect)) per Discussione [principale, 5, principale]

La ragione per il controllo delle autorizzazioni in ritardo è un inflationThreshold della classe ReflectionFactory che viene utilizzato dal metodo invoke di NativeMethodAccessorImpl.java:

public Object invoke(Object obj, Object[] args) 
     throws IllegalArgumentException, InvocationTargetException { 
    if (++numInvocations > ReflectionFactory.inflationThreshold()) { 
     MethodAccessorImpl acc = (MethodAccessorImpl) new MethodAccessorGenerator() 
       .generateMethod(method.getDeclaringClass(), method 
         .getName(), method.getParameterTypes(), 
         method.getReturnType(), method 
           .getExceptionTypes(), method 
           .getModifiers()); 
     parent.setDelegate(acc); 
    } 

    return invoke0(method, obj, args); 
} 

Per disattivare il ritardo si potrebbe usare API Reflection :)

Field hack = Class.forName("sun.reflect.ReflectionFactory").getDeclaredField("inflationThreshold"); 
hack.setAccessible(true); 
hack.set(null, 0); 
+1

La mia versione JDK è 1.6.0_23 btw – jeha

+0

Ha funzionato, grazie! –

Problemi correlati