2011-10-31 21 views
5

Próbuję załadować klasę przez URLClassLoader (no, to nie działa z normalnym ładowaniem klasy) i chcę, aby nie mieli żadnych uprawnień.Błąd uprawnień Odbicia Java

Dlatego też stworzyłem własnego menedżera bezpieczeństwa, który tworzy klucz podczas uruchamiania, który można uzyskać tylko raz (w głównym wątku). Menedżer bezpieczeństwa ma 2 listy, applicationThread, które otrzymają wszelkie prawa i tymczasową listę, która otrzyma jedno prawo tylko raz (chodzi o odbicie).

Ponieważ jest to bardzo trudne do descripe, postanowiłem przesłać całość: okiem na poniższy link

Ok, wracając: I stworzył wątek Watchdog, który sprawdza, czy gwint nie za dużo czasu.

Kiedy teraz zacznę wysyłać dwie klasy z adresu URLClassLoader, nazywam dokładnie 30 metodami, nie otrzymując żadnych błędów, ale w trakcie 31. połączenia próbuje sprawdzić uprawnienia dla następujących elementów, ale to się dzieje po 30-tym telefonie.

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

Czy ktoś wie, co się tam dzieje?

edycja: Miałem czas, aby rozebrać przykład. http://myxcode.at/securitymanager.zip Dowiedziałem się, że program SecurityManager nie jest pytany synchronicznie. Po prostu uruchom ten mały kawałek kodu i spójrz na czerwone linie.

Jeśli czerwone linie znajdują się w pierwszej linii, po prostu uruchom program ponownie, przekonasz się, że wydaje się on nieco niekontrolowany.

Problem jest mniej więcej taki, że potrzebuję synchronizacji menedżera bezpieczeństwa. Oto moje wyniki dla tych, którzy nie mogą zmierzyć się z błędem (błąd?) http://pastebin.com/E9yLRLif

edit2: może jest o konsoli? może konsola jest zbyt wolna?

+2

zagotować problemu w dół do małej, zwięzłe, kompletne przykład i po to tutaj. –

+1

ok, oto jest;) –

Odpowiedz

4

Dla mnie następuje sprawdzenie, kiedy i=15:

checkPermission ((java.lang.RuntimePermission accessClassInPackage.sun.reflect)) dla gwintu [główny, 5, główny]

Powodem do opóźnionego sprawdzania uprawnień jest inflationThreshold klasy ReflectionFactory który jest używany metodą invoke z 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); 
} 

Aby wyłączyć opóźnienie można użyć refleksji API :)

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

Moja wersja JDK to 1.6.0_23 btw – jeha

+0

Pracowałem, dziękuję! –