이 키워드로 인한 컴파일러 오류로 인해 버그에서 벗어날 수 없었습니다.
라이브러리 작성자가 구현에서 유지 관리 할 부분을 결정할 수 있도록 버그에서 응용 프로그램 작성자를 저장하는 것은 그리 중요하지 않습니다.
도서관이 있다면
class C {
public void foo() { ... }
private void fooHelper() { /* lots of complex code */ }
}
foo
구현 을 대체 fooHelper
하고 급진적 인 방식으로 변경 하고 싶을 수도 있습니다 . fooHelper
내 문서의 모든 경고에도 불구하고 많은 사람들이 사용하기로 결정한 경우에는 그렇게 할 수 없습니다.
private
라이브러리 작성자 private
는 몇 년 동안 내부 세부 정보를 유지해야한다는 두려움없이 라이브러리를 관리 가능한 크기의 메서드 (및 도우미 클래스) 로 나눌 수 있습니다.
컴파일러가 정보 숨기기를 시행하는 것이 무엇이 가치가 있습니까?
참고로 Java private
에서는 컴파일러가 아니라 Java 바이트 코드 검증기에 의해 시행됩니다 .
리플렉션이이 메커니즘을 무시할 수 있습니까? 컴파일러가 정보 숨기기를 시행하는 것이 무엇이 가치가 있습니까?
Java에서는 리플렉션 만이이 메커니즘을 무시할 수 있습니다. private
Java 에는 두 가지 종류가 있습니다 . 이것의 종류는 private
하나의 외부 클래스 private
가 바이트 코드 검증기에 의해 확인되는 다른 외부 클래스의 멤버에 액세스하지 못하지만 private
내부 클래스가 패키지 전용 합성 접근 자 메소드를 통해 사용합니다
public class C {
private int i = 42;
public class B {
public void incr() { ++i; }
}
}
class B
(실제로 이름이 지정된 C$B
)는을 사용 하기 때문에 i
컴파일러 는 바이트 코드 검증기를 통과하는 방식 B
으로 액세스 할 수있는 합성 액세서 메소드를 작성합니다 C.i
. 불행히도에서 ClassLoader
클래스를 만들 수 있기 때문에 jar 파일이 봉인되지 않은 경우 패키지 에서 새 클래스를 만들어 내부 클래스에 노출 된 개인을 byte[]
얻는 것이 매우 간단합니다 .C
C
C
적절한 private
시행을 위해서는 클래스 로더, 바이트 코드 검증기 및 개인에 대한 반사 액세스를 막을 수있는 보안 정책 간의 조정이 필요합니다.
클래스의 비밀 상태를 공격으로부터 보호하는 데 사용할 수 있습니까?
예. "보안 분해"는 프로그래머가 각 모듈의 보안 속성을 유지하면서 협력 할 수있을 때 가능합니다. 다른 코드 모듈의 작성자가 내 모듈의 보안 속성을 위반하지 않도록 신뢰할 필요는 없습니다.
Joe-E 와 같은 객체 기능 언어 는 정보 숨기기 및 기타 방법을 사용하여 안전한 분해가 가능합니다.
Joe-E는 객체 기능 분야에 따라 안전한 프로그래밍을 지원하도록 설계된 Java 프로그래밍 언어의 하위 집합입니다. Joe-E는 보안 시스템의 구축을 용이하게하고 Joe-E에 내장 된 시스템의 보안 검토를 용이하게하기위한 것입니다.
이 페이지에서 링크 된 논문은 private
시행이 어떻게 안전한 분해를 가능하게 하는지를 보여줍니다 .
안전한 캡슐화 제공
그림 1. 추가 전용 로깅 기능
public final class Log {
private final StringBuilder content;
public Log() {
content = new StringBuilder();
}
public void write(String s) {
content.append(s);
}
}
추가 전용 로그 기능을 구축하는 방법을 보여주는 그림 1을 고려하십시오. 프로그램의 나머지 부분이 Joe-E로 작성된 경우, 코드 검토자는 로그 항목 만 추가 할 수 있으며 수정하거나 제거 할 수 없음을 확신 할 수 있습니다. 이 검토는 Log
클래스 검사 만 필요하고 다른 코드를 검토 할 필요가 없기 때문에 실용적 입니다. 따라서이 특성을 확인하려면 로깅 코드에 대한 로컬 추론 만 필요합니다.