programing

불법 반사 접근이란 무엇입니까?

goodcopy 2022. 8. 8. 15:49
반응형

불법 반사 접근이란 무엇입니까?

Java 9의 불법 반사 액세스에 대한 질문이 많습니다.

에러 메시지에 대한 대응에 대해서는 많은 논의를 했습니다만, 실제로 불법적인 반사 액세스가 무엇인지 알고 싶습니다.

제 질문은 다음과 같습니다.

무엇이 부정 반사 액세스를 정의하고 어떤 상황에서 경고를 발생시키는가?

Java 9에서 도입된 캡슐화 원칙과 관련이 있다는 것을 알 수 있었습니다만, 이 모든 것이 어떻게 맞물리는지, 경고를 트리거하는 것인지, 어떤 시나리오에서 발생하는지에 대한 설명은 찾을 수 없었습니다.

모듈 및 각 패키지 간의 액세스에 대한 이해와는 별개로.이 문제의 핵심은 모듈 시스템 #안심-강함-캡슐화에 있다고 생각합니다.그 질문에 답하기 위해서, 관련하는 부분을 선택해 보겠습니다.

무엇이 부정 반사 액세스를 정의하고 어떤 상황에서 경고를 발생시키는가?

Java-9로의 이행을 지원하기 위해 모듈의 강력한 캡슐화를 완화할 수 있습니다.

  • 구현은 정적 액세스, 즉 컴파일된 바이트 코드를 제공할 수 있습니다.

  • 이름 없는 모든 모듈에서 코드에 대해 열려 있는 하나 이상의 모듈의 패키지로 런타임 시스템을 호출하는 수단, 즉 클래스 경로에서 코드에 사용할 수 있습니다.런타임 시스템이 이러한 방식으로 호출되고, 그렇게 함으로써 리플렉션 API의 일부 호출이 성공했을 경우 실패했을 수 있습니다.

이러한 경우, 실제로는 "불법"반사 액세스를 하게 됩니다. 왜냐하면 순수한 모듈러 환경에서는 이러한 액세스를 할 수 없기 때문입니다.

이 모든 것이 어떻게 맞물리는지, 어떤 시나리오에서 경고를 트리거하는 이유는 무엇입니까?

시 새로운 옵션인 """""""""""""""""""""""에 의해 제어됩니다""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""--illegal-access에서는 "Java9"와 같습니다.permit . 。permit를 지정하면, 확실히 할 수 있습니다.

이러한 패키지에 대한 첫 번째 리플렉티브액세스 조작에 의해 경고가 발행되지만 그 시점 이후에는 경고가 발행되지 않습니다.이 단일 경고에서는 추가 경고를 활성화하는 방법에 대해 설명합니다.이 경고는 억제할 수 없습니다.

는 값 「」으로 할 수 .debug 및 스택트레이스) ('메시지')warn각 및 ('메시지')deny(어느 쪽인가 하면)


어플리케이션 디버깅 및 수정은 다음과 같습니다.

  • 를를 run run run 로 --illegal-access=deny이러한 지시를 포함한 모듈 선언 없이 한 모듈에서 다른 모듈로 패키지를 여는 것을 알고 피한다.opens--add-opensVM arg.
  • 에서 JDK 에 대한 정적 는 JDK API를 할 수 .jdeps툴로 사용하다--jdk-internals 표시

부정 리플렉트 액세스 조작이 검출되었을 때 표시되는 경고 메시지의 형식은 다음과 같습니다.

WARNING: Illegal reflective access by $PERPETRATOR to $VICTIM

여기서:

$PERPETRATOR는, path (사용 가능한 입니다.또, 「」는, 「JAR-file path」(JAR-file path)입니다.

$VICTIM 액세스 입니다.여기에는 됩니다.여기에는 엔클로저 타입의 완전 수식 이름이 포함됩니다.

이러한 경고 예에 대한 질문: = JDK9: 잘못된 반사 액세스 작업이 발생했습니다. org.disc.core.Py System State(파이 시스템 상태)

마지막으로 중요한 것은 이러한 경고에 직면하지 않고 장래의 안전을 확보하기 위해 필요한 것은 모듈이 이러한 부정 반사 액세스를 하지 않도록 하는 것입니다.:)

Java 9 모듈 시스템에 대한 Oracle 기사가 있습니다.

기본적으로 모듈의 유형은 공용 유형이 아닌 경우 해당 패키지를 내보내지 않는 한 다른 모듈에서 액세스할 수 없습니다.표시할 패키지만 노출합니다.Java 9 에서는, 이것은 리플렉션에도 적용됩니다.

https://stackoverflow.com/a/50251958/134894,에서 지적한 바와 같이 https://stackoverflow.com/a/50251958/134894,과AccessibleObject#setAccessibleJDK8 - JDK9 - JDK9 - JDK9 - JDK9 - JDK9 - JDK9 - JDK9 - JDK에 JDK9가 추가되었습니다.

이 메서드는 클래스 C의 발신자가 다음 중 하나가 보류되어 있는 경우 클래스 D를 선언하는 멤버에 대한 접근을 가능하게 하기 위해 사용할 수 있습니다.

  • C와 D는 같은 모듈 내에 있습니다.
  • D를 포함하는 모듈이 적어도 C를 포함하는 모듈로 내보내는 패키지의 멤버는 public이고 D는 public입니다.
  • 멤버는 보호되는 스태틱, D를 포함하는 모듈이 적어도 C를 포함하는 모듈로 내보내는 패키지로 D는 퍼블릭, C는 D의 서브클래스입니다.
  • D is in a package that the module containing D opens to at least the module containing C. All packages in unnamed and open modules are open to all modules and so this method always succeeds when D is in an unnamed or open module.

which highlights the significance of modules and their exports (in Java 9)

그냥 보세요setAccessible()액세스에 사용되는 방법private필드 및 메서드:

https://docs.oracle.com/javase/8/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-

https://docs.oracle.com/javase/9/docs/api/java/lang/reflect/AccessibleObject.html#setAccessible-boolean-

Now there is a lot more conditions required for this method to work. The only reason it doesn't break almost all of older software is that modules autogenerated from plain JARs are very permissive (open and export everything for everyone).

if you want to hide warnings you could just use "--add-opens" option

--add-opens <source-module>/<package>=<target-module>(,<target-module>)*

for example you have an error:

java.lang.ClassLoader.findLoadedClass(java.lang.String)

First open String java 11 documentation Class String where you can find module and package name

Module java.base, Package java.lang

Solution:

java --add-opens=java.base/java.lang=ALL-UNNAMED -jar example.jar

If you want to go with the add-open option, here's a command to find which module provides which package ->

java --list-modules | tr @ " " | awk '{ print $1 }' | xargs -n1 java -d

the name of the module will be shown with the @ while the name of the packages without it

NOTE: tested with JDK 11

IMPORTANT: obviously is better than the provider of the package does not do the illegal access

ReferenceURL : https://stackoverflow.com/questions/50251798/what-is-an-illegal-reflective-access

반응형