리플렉션을 사용하여 개인 멤버를 변경하거나 C #에서 개인 방법을 사용하는 이유는 무엇입니까? [복제]
이 질문에 이미 답변이 있습니다.
최근에 C #을 사용하는 문제를 발견하고 반영을 사용하여 개인 멤버를 설정하여 해결했습니다 .
개인 멤버 / 필드를 설정하고 개인 메소드를 실행하는 것도 C #에서 허용되고 가능한 일이라는 사실에 랐습니다. 이 경우는 수행하는 방법에 대한 질문이 아닙니다. 문서화가 잘되어 있습니다. 제 질문은 다음과 가변합니다. 왜?
필드 / 멤버 / 접근 방법을 개인 / 내부로 설정하는 경우 언어로서의 C #에서 접근 할 수있는 필드를 외부로 접근 할 수 있습니까? 나는 어떤 종류의 예외를 던질 생각합니다. 클래스가 변경하거나 설정하기를 사용 방법 나 생성하지 않을까요?
수정자는 액세스 소비자 또는 상속자 등에 노출 하려는 API를 문서화하는 데 도움이되기 때문 입니다 .
보안 / 제어 메커니즘 액세스 이 아닙니다 .
그건 불가능 하게 할 수있는 누군가를 방지 할 수 있습니다. 더 어렵게 만들 수 있고, 안전하지 않은 코드를 사용하고 맹목적으로 비트 설정을 시작할 수 있습니다. 결국, 그것은 그런 프로그램 / 기계이고, 그런 일을 할 수 있습니다.
언어의 디자인은 당신이 발을 쏘고 나쁜 일을하는 것을 어렵게 만듭니다. 그러나 그것은 불가능하게 만드는 것이 불가능하지만 그렇게하면 사용자가 비정상적이지만 여전히 바람직한 일을하는 것을 제한 할 수 있습니다.
사적인 성찰을 선언합니다. 완전 신뢰는 완전 신뢰를 의미 합니다 . 당신이 옳은 것을 신뢰하는 것이 왜 그렇게되지 않았습니까?
(사실, 비공개 리플렉션에 대한 보안 모델은 실제로 여기에서 스케치 한 것보다 훨씬 더 복잡하지만 제 요점에는 영향을주지 않습니다.이 기능은 정책의 적용을받습니다 . 개요 는 리플렉션에 대한 보안 고려 사항 (MSDN) 참조) ) 반영과 보안 정책이 상호 작용하는 방식에 대해 설명합니다.)
가시성 수정자는 보안을위한 것이 아닙니다.
그럴듯한 구조화 된 API / 코드베이스로 작업하는 것을보다 먼저 만들기위한 것입니다. 프로그래머를 괴롭히지 않고 소비자가 관심을 가져야 할 것들만 노출시키는 것입니다.
송신 렉션은 코드와 상호 작용하는 방법입니다. 리플렉션이 프라이버시에 대한 원어의 기대를 존중한다면 그런 것과 같은 다른 필요가 있습니다. 거북은 끝까지 내려갑니다.
그것이 의미하는 바라고 가정하여 시작하고, 어쨌든 아무도 있고 싶지 않은 일을하는 것이 잘못된 노력이라는 가정을 재평가하십시오.
거기 속임수를 써야합니다.
설정해야 할 경우에 설정해야 할 경우에는 설정해야 할 경우에는 쉽게 할 수있는 경우에는해야 할 필요가 있습니까? 당신의 수업이 아니라고 독점 라이브러리이고 버그를 해결해야한다면 어떨까요? 나는 당신 이 그런 일 을 해야하는 것이 아닙니다 . 사실 저는 당신 이 그렇게 해서 안된다고 말할 것입니다.하지만 실제로는 터무없는 속임수입니다. 사실은 사실은 확실합니다.
그러나 항상 의심의 사용에 의문을 제기 해야하며, 물론 객체의 공개 API를 위반하면 문제가 가능성이 높으며 잘못된 일이라는 것을 알고 있습니다. 언급 수없는 일부 코드에서 작업을 수행 할 수있는 유일한 방법 인 언급 한 시나리오를 제외하고.
한 가지 주목할 점은 C ++ 및 그 파생물이 강력한 액세스 제어 기능을 가지고 있다는 것입니다 OOP 언어가 많다는 것입니다. 예를 들어, Perl 5 객체는 외부에서 완전히 개방되어 개인 메서드와 데이터는 관례에만 존재합니다. 하지마. C #의 리플렉션 기능과 약간의 문제가 있습니다.
그러나 나는 또 다른 시간을 반복 한다. 당신은 거의 확실하게 그것을 하지 말아야한다. 일상적인 사용을위한 것이 아닙니다.
나는 반사적 인 조치 없이는 내 얼굴조차 볼 수 없다. 좋아, 나는 비디오로 나 자신을 볼 수있는 카메라라는 광학 장치에 의해 이루어집니다.
내가 아팠다면 의사가 내 질병을 진단하고 치료하기 위해 X- 레이가 필요할 때 이미 죽었을 것입니다. 그러나 모든 종류의 반사는 내 사적인 것이 무엇인지 알 수 없습니다. 그리고 나 자신도 볼 수 없습니다.
엑스레이 (또는 단층 촬영 같은 것)는 내 내부를 볼 수 있습니다.
차라리 반성보다는 현실적이라고 말하고 싶습니다. 하지만 예, 저는 제 눈을 사용하여 실제 저를 직접 볼 수 없습니다. 제가 본 모든 저들은 전형적인 반성입니다. (깊이 생각하면 눈도 현실을 반영합니다.)
성찰은 특별한 시각없이 현실과 관련이 있다고 가정합니다. 그리고 소비자 코드가 개체 지향 규칙 내에서 BindingFlags. Public으로 제한되어 가정 할 수 있습니다.
실제 우주에서는 거의 불가능한 것이 없습니다. 우리에게 가능한 불가능한 것의 유일한 차이점은 우리가 인간이기 때문에 인간이 할 수 있는지 여부입니다.
반사가 프로그램의 세계에서 모든 것을 할 수있는 것은 위험 해 보이며, 이제는 인간의 논리에서 보안상의 것이 완전히 신뢰되어야합니다.
좋은 질문.
내 대답은 다음과 달라집니다. 액세스 수정 자 및 가시성은 API 디자인의 일부입니다. 리플렉션을 사용하면 API를 우회하고 낮은 수준에서 데이터를 수정하는 등 거의 모든 것을 완벽하게 제어 할 수 있습니다.
액세스 한정자는 외부에서 실수로 변경하지 않도록 클래스를 안전하게 만들 수 있습니다. 메소드를 호출하거나 "우연히"공개 멤버에 액세스 할 수 있습니다. 반성하면 우연히 일을했다고 유지하기가 어렵습니다.
반사에 대한 낮은 수준의 접근이 불가능하다면 우리 모두가 알고 좋아하는 많은 것들이 사실상 불가능할 것입니다.
프로덕션 코드의 경우 :
우리는 하나의 웹 서비스가 NZ 시간대에서 작동하기를 원했습니다. 아마도 올바른 해결책은 .NET Framework 직렬화 코드를 포함하여 모든 코드를 다시 작성하여 .NET Framework를 사용하는 DateTimeOffset
것이지만 가장 간단한 해결책은 현재 표준 시간대를 저장하는 .NET Framework의 두 개인 필드 (일반적으로 레지스트리 호출을 기반으로 함)를 효과적으로 조정하는 것입니다. )를 사용하여 NZ 시간대를 명시 적으로 사용합니다.
.NET Framework 2.0이 표준 내장 처리에서 업데이트 된 경우 코드를 다시 작업해야 할 수도 있습니다.
'IT' 카테고리의 다른 글
파일 이름 또는 확장명에 사용할 수있는 DateTime.ToString () 형식? (0) | 2020.09.06 |
---|---|
14.04에서 nodejs, npm 및 노드를 완전히 제거하십시오. (0) | 2020.09.06 |
ellipsize = "marquee"를 항상 스크롤하는 방법이 있습니까? (0) | 2020.09.06 |
UITableView 명확한 배경 (0) | 2020.09.06 |
자바 펼쳐 시간으로 고유 번호 만들기 (0) | 2020.09.06 |