32
loading...
This website collects cookies to deliver better user experience
8
, 11
버전에서 시작할 것이다. 왜냐고? 지금 기준으로 보안 업데이트를 제공해주는 LTS 버전이니까.17
으로 시작할 수도 있겠지.setAccessible(boolean)
메소드와 함께 trySetAccessible()
이라는 생소한 메소드를 목격할 것이다.private
멤버 접근이 불가능하다.Module-info.java
파일을 통해 모듈 관리에 속하지 않거나, 같은 모듈 내 클래스는 여전히 접근 가능하다.setAccessible(true)
걸어봐야, 너에게 다가오는 건 InaccessibleObjectException
예외가 반겨줄 것이다.setAccesible
접근을 막고 싶으면 SecurityManager
클래스를 네 클래스로더에 주입해야 한다. 그렇지 않으면 기본적으로 다른 앱이나 라이브러리가 private
접근이 가능하다. 이를 관장하는 메소드는 checkPermission
이다.prviate
로 묶어버려서 빈을 못 불러와 trySetAccessible
메소드로 걷어서 해결했다.trySetAccessible()
사용법은 간단하다.setAccessible(boolean)
사용 사례로 봐야 인자에 true
넣는 경우 단 하나뿐이기 때문에, 자바 9 이상에서 trySetAccessible
메소드를 대신하여 엘레강~스한 코드와 함께 InaccessibleObjectException
예외를 회피할 수 있다.Class<?> cls = IWannaReflectThis.class;
Field field = cls.getDeclaredField("iWannaAccessThisField");
if(field.trySetAccessible()) {
System.out.println("필드 까본 결과: " + field.get(gotcha));
} else {
System.out.println("에엑따! 자바9이상이다!");
}