2011-10-31 5 views
5

URLClassLoader를 통해 클래스를로드하려고합니다 (정상 클래스 로더와 작동하지 않음). 권한이 없기를 바랍니다.자바 리플렉션 권한 오류

따라서, 나는 (메인 스레드에서) 한 번만 요청할 수있는 시작시 키를 생성하는 자체 보안 관리자를 만들었습니다. 보안 관리자에는 2 개의 목록 인 applicationThread가 있으며 모든 권한이 부여되고 temporaryList가 한 번만 권한 부여됩니다 (이는 리플렉션에 관한 것입니다).

이 descripe하기가 매우 어렵다으로

, 난 모든 일 업로드하기로 결정 : 아래 링크에서 모습을

좋아, 돌아 오는 : 스레드하지 않는 경우는 내가 확인 감시 스레드를 생성 너무 많은 시간이 걸린다.

URLClassLoader에서 두 개의 클래스를 인스턴스화하기 시작하면 오류없이 정확히 30 개의 메소드를 호출하지만 31 번째 호출에서는 다음 호출에 대한 권한을 확인하려고 시도하지만 이는 30 번째 호출 이후에만 발생합니다.

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

아무도 무슨 일이 일어나고 있는지 알고 있습니까?

편집 : 예제를 삭제할 시간이있었습니다. http://myxcode.at/securitymanager.zip SecurityManager가 동기식으로 요청되지 않는다는 것을 알았습니다. 이 작은 코드를 실행하고 빨간색 선을 살펴보십시오.

첫 줄에 빨간색 줄이 표시되면 프로그램을 다시 실행하면 제어가 제대로되지 않는 것입니다.

다소 문제는 보안 관리자를 동기화해야한다는 것입니다. 오류가 발생하지 않는 사람들을위한 내 결과는 다음과 같습니다 (버그?) http://pastebin.com/E9yLRLif

edit2 : maybe about the console? 콘솔이 너무 느린 것일까 요?

+2

삶아 문제를 사용하고 여기에 게시 할 수있는 지연을 사용하지 않으려면. –

+1

ok, 여기 있습니다;) –

답변

4

나를위한 검사가 발생하는 경우 i=15 :

스레드 용의 checkPermission ((java.lang.RuntimePermission의 accessClassInPackage.sun.reflect)) 주, 5 주]

이유

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); 
} 
,536 : 지연 권한 검사에 대한 NativeMethodAccessorImpl.javainvoke 방법으로 사용되는 ReflectionFactory 클래스의 inflationThreshold입니다

는 작고, 간결하고, 완전한 예를 아래로 반사 API :

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

내 JDK 버전은 1.6.0_23 btw – jeha

+0

일했습니다. 고마워요! –