아래의 코드 조각을 이해하지 못했습니다. 이것은 내가 가지고 간 코드 스 니펫 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);
}
이 코드는 컴파일되지 않습니다 ... 최종 변수로 변환 할 수 없습니다. – Selvin
@Selvin, 컴파일하지 말라고 물어 보았습니다.이 코드를 이해하도록 요청했습니다. 왜 이것을 컴파일하고 싶습니까? 나는 모든 것을 위에서 설명했다. 내가 왜 내 질문을 다운 그레이드 했습니까? –
** 유효한 java 코드가 아닙니다 ... ** 무엇을 이해하지 못합니까? – Selvin