개인 방법은 정말 안전한가요?
에서는 " " " 입니다.private
액세스 수식자는 클래스 밖에 표시되지 않기 때문에 안전하다고 간주됩니다.그럼 외부에서도 그 방법을 모르는 거군요.
하지만 자바 반사가 이 규칙을 깨기 위해 사용할 수 있다고 생각했습니다.다음 경우를 고려하십시오.
public class ProtectedPrivacy{
private String getInfo(){
return "confidential";
}
}
이제 다른 수업에서 정보를 얻습니다.
public class BreakPrivacy{
public static void main(String[] args) throws Exception {
ProtectedPrivacy protectedPrivacy = new ProtectedPrivacy();
Method method = protectedPrivacy.getClass().getDeclaredMethod("getInfo", null);
method.setAccessible(true);
Object result = method.invoke(protectedPrivacy);
System.out.println(result.toString());
}
}
지금 이 순간, 위와 같은 일을 하려면 우리는 메서드 이름을 알아야 하기 때문에 나는 여전히 개인 방식이 안전하다고 생각했다.그러나 다른 사람이 작성한 개인 메서드를 포함하는 클래스는 이러한 내용을 볼 수 없습니다.
하지만 내 요점은 코드 아래 행 때문에 무효가 된다.
Method method[] = new ProtectedPrivacy().getClass().getDeclaredMethods();
, 이 ,, nowmethod[]
위에 필요한 모든 것이 포함되어 있습니다.Java reflection java java java java java java java java java java java java java java java java java java java java java java?
저는 Java Documentation의 몇 가지 점을 인용하여 제 질문을 명확히 하겠습니다.
액세스 레벨 선택에 관한 힌트:
다른 프로그래머가 클래스를 사용하는 경우 오용으로 인한 오류가 발생하지 않도록 해야 합니다.액세스 레벨은, 이 작업에 도움이 됩니다.특정 멤버에게 적합한 가장 제한적인 접근레벨을 사용합니다.특별한 이유가 없는 한 비공개로 하세요.
'안전하다'는 말이 무슨 뜻인지에 따라 다르죠.이런 종류의 작업을 허용하는 보안 관리자와 함께 실행한다면, 모든 종류의 불쾌한 작업을 성찰과 함께 수행할 수 있습니다.하지만 그런 환경에서는 라이브러리를 수정하여 메서드를 공개할 수 있습니다.
이와 같은 환경에서는 액세스 제어가 효과적으로 "어드바이저리"됩니다. 즉, 코드를 효과적으로 신뢰하고 있는 것입니다.실행 중인 코드를 신뢰할 수 없는 경우 보다 제한적인 보안 관리자를 사용해야 합니다.
액세스 수식자는 보안과는 무관합니다.실제로 액세스 수식자는 보안의 반대입니다.데이터나 알고리즘을 보호하는 것이 아니라 데이터와 알고리즘을 알아야 하는 요건으로부터 사람을 보호하는 것입니다.따라서 기본 수식자는 패키지입니다.패키지에서 작업 중인 경우 이미 알아야 합니다.
데이터 및 코드의 메서드에 대한 지식과 함께 언제, 어떻게 사용하는지 알 수 있는 응답성이 필요합니다.자신의 방법을 비공개로 하는 것이 아니라 다른 사람이 알아채지 못하도록 하기 위해(a) 사용자가 foo 후에만 전화를 건다는 사실을 알지 못하고 bar = 3.1415 및 (b) 아는 것이 도움이 되지 않기 때문에 전화를 건다는 사실을 알 수 없기 때문입니다.
접속 변조자는 간단한 문구로 요약할 수 있습니다. "TMI, 친구, 난 그걸 알 필요가 없었어."
'안전하다'는 말은 개인 메서드를 호출하여 객체를 해치지 않기 위해 API를 사용하는 사용자 또는 다른 개발자를 보호하는 것입니다.그러나 이 메서드를 호출해야 하는 경우 Reflection을 사용하여 호출할 수 있습니다.
문제는 그걸 누구로부터 구하려는 거야?내 생각에, 당신 코드의 그런 고객은 여기서 막막한 고객이다.
을 다른 사람이 )private
위 계급의 구성원은 본질적으로 자신의 무덤을 파는 것이다. private
회원은 공개 API에 포함되지 않으며 예고 없이 변경될 수 있습니다.클라이언트가 위와 같은 방식으로 이러한 개인 멤버 중 하나를 소비하는 경우 개인 멤버가 변경된 새로운 버전의 API로 업그레이드하면 클라이언트가 중단됩니다.
기능에는 책임이 따른다.할 수 없는 일도 있고 할 수 있지만 해서는 안 되는 일도 있습니다.
개인 수식자는 가장 제한된 방식으로 제공/사용/사용됩니다.클래스 밖에서 보이지 않아야 하는 구성원은 비공개로 정의해야 한다.하지만 이것은 Reflection을 통해 깨질 수 있습니다.그러나 이는 개인 정보를 사용하지 않아야 한다는 것을 의미하거나 안전하지 않다는 것을 의미하지 않습니다.그것은 당신이 사물을 현명하게 또는 건설적으로 사용하는 것에 관한 것이다.
API의 클라이언트프로그래머를 신뢰한다고 가정했을 때, 또 다른 관점에서는 이러한 특정 함수를 사용하는 것이 얼마나 안전한가 하는 것입니다.
공개적으로 사용할 수 있는 함수는 명확하고 문서화되어 있으며 거의 변경되지 않는 인터페이스를 코드에 제공해야 합니다.개인 기능은 구현 세부사항으로 간주될 수 있으며 시간이 지남에 따라 변경될 수 있으므로 직접 사용하는 것은 안전하지 않습니다.
클라이언트 프로그래머가 이러한 추상화를 회피하기 위해 노력한다면, 그들은 자신들이 무엇을 하고 있는지 알고 있다고 선언하는 것입니다.더 중요한 것은, 서포트되고 있지 않기 때문에, 향후의 버전의 코드에서는 동작하지 않게 될 가능성이 있는 것을 이해하고 있는 것입니다.
private
보안을 위한 것이 아니라 코드를 깨끗하게 유지하고 실수를 방지하기 위한 것입니다.사용자는 다른 모듈의 모든 세부 사항을 걱정할 필요 없이 코드를 모듈화할 수 있습니다(및 방식)를 모듈화할 수 있습니다.
일단 코드를 풀면 사람들은 그게 어떻게 작동하는지 알 수 있어요.컴퓨터에서 코드가 실행되도록 하려면 논리를 "숨길" 방법이 없습니다.바이너리로 컴파일 하는 것도 난독화 수준입니다.
따라서 다른 사람이 호출할 수 없는 특별한 작업을 수행하도록 API를 설정할 수 없습니다.웹 API의 경우 서버 측에서 제어할 메서드를 배치할 수 있습니다.
언급URL : https://stackoverflow.com/questions/19856630/are-private-methods-really-safe
'IT' 카테고리의 다른 글
목록 통합 및 기능 기능이 "루프용"보다 빠릅니까? (0) | 2022.11.27 |
---|---|
라라벨 블레이드 점검 비어 있는 포어치 (0) | 2022.11.27 |
루프에서 나머지 작업을 실행하는 Java 스레드가 다른 모든 스레드를 차단합니다. (0) | 2022.11.18 |
"INSERT..."를 하는 방법이 있습니까?Zend Framework 1.5의 중복 키 업데이트"에 대해 설명합니다. (0) | 2022.11.18 |
MySQL 이름 배열이 아닌 곳? (0) | 2022.11.18 |