2017-02-18 1 views
0

아래의 코드 조각을 이해하지 못했습니다. 이것은 내가 가지고 간 코드 스 니펫 AsynchronousChannelGroupImpl android of class입니다. 이것들은 제가 이해하지 못했던 것들 아래에 있습니다.실행 가능한 코드가 동작을 반복하고 있습니다.

1) var1이 final로 지정되지만 실행 본문에서 변경됩니다.

2) var1은 "새로운 Runnable() {....}"에서 생성 된 Runnable 객체의 메모리 주소를 가리 킵니다. 그 Runnable 객체의 힙 메모리에는 run() 메서드가 있습니다. 이 run() 메소드는 AccessController 클래스 변수를 사용하여 새로 생성 된 PrivilegedAction 객체의 메모리 주소와 var3을 매개 변수로 포함하는 AccessControler의 doPrivileged() 메소드에 접근합니다. 그러나이 새로 생성 된 PrivilegedAction 객체는 run() 메서드를 다시 호출하여 var1의 run() 메서드를 호출합니다. 그것은 일종의 반복적 인 행동입니다.

3) 그래서 var1은 고정 된 위치를 가리 킵니다. run() 메서드는 메모리 주소 안에 있으므로 run 메서드를 호출 할 수 있습니다. 그러나 새로운 PrivilegedAction 객체는 매번 생성되며 정의되고 일관성이 없습니다. 우리는이 객체가이 많은 힙 메모리 공간을 포함하고 있다고 말할 수는 없기 때문에 var1.run() 메소드처럼 run() 메소드를 실행하기 위해 다시 var1을 요청하고 있습니다.

이 스 니펫이 메모리 구조를 어떻게 변경하는지 알고 싶습니다. 내부 시스템? 컴퓨터 아키텍쳐 관점에서 알고 싶습니다.

public final void execute(final Runnable var1) { 
     SecurityManager var2 = System.getSecurityManager(); 
     if(var2 != null) { 
      final AccessControlContext var3 = AccessController.getContext(); 
      var1 = new Runnable() { 
       public void run() { 
        AccessController.doPrivileged(new PrivilegedAction() { 
         public Void run() { 
          var1.run(); 
          return null; 
         } 
        }, var3); 
       } 
      }; 
     } 

     this.executeOnPooledThread(var1); 
    } 
+0

이 코드는 컴파일되지 않습니다 ... 최종 변수로 변환 할 수 없습니다. – Selvin

+0

@Selvin, 컴파일하지 말라고 물어 보았습니다.이 코드를 이해하도록 요청했습니다. 왜 이것을 컴파일하고 싶습니까? 나는 모든 것을 위에서 설명했다. 내가 왜 내 질문을 다운 그레이드 했습니까? –

+0

** 유효한 java 코드가 아닙니다 ... ** 무엇을 이해하지 못합니까? – Selvin

답변

1

Java 디 컴파일 된 바이트 코드는 프로그래머가 아닙니다. 당신의 논리를 거기에 두지 마십시오.

관련 문제