2013-04-16 6 views
0

의 비 public (java-native) 클래스에 액세스합니다. MethodHandleNatives.getTargetMethod (MethodHandle) AccessibleObject 메서드를 사용하려고합니다. MethodHandleNatives 클래스는 public이 아닙니다. 그럼 내가 어떻게 할 수 있는지 아는 사람 있습니까?JDK (7)

개인적인 방법과 필드에 반사를 통해 접근 할 수 있다는 것을 알고 있으므로 이것이 가능한지 묻습니다.

감사합니다.

+0

예는 방법은 기본입니다 아무 차이가 없다는 사실을 possible-한다)는 정직 아니지만 = 작동합니다. – assylias

답변

1

해결책을 찾았습니다.

MethodHandle mh; // a MethodHandle Object 
Class<?> mhn; 
    try { 
     mhn = Class.forName("java.lang.invoke.MethodHandleNatives"); 
     Constructor<?> con = mhn.getDeclaredConstructor(); 
     con.setAccessible(true); 
     Object mhnInstance = con.newInstance(); 
     Method getTargetMethod = mhn.getDeclaredMethod("getTargetMethod", new Class<?>[]{MethodHandle.class}); 
     getTargetMethod.setAccessible(true); 
     Method inside = (Method) getTargetMethod.invoke(mhnInstance, mh); 
     System.out.println("INSIDE = " + inside.toGenericString()); 

    } catch (Throwable e) { 
     e.printStackTrace(); 
    } 
+0

저는 전에 이와 같은 리플렉션 해킹을 사용해야했습니다. 추악하고 피해야하지만 때로는 많은 복사 및 붙여 넣기가 없이는 다른 방법이 없습니다. 클래스 또는 메소드가 package-private 인 또 다른 옵션은 프로젝트의 동일한 패키지에서 모든 항목이 public 인 래퍼 클래스를 선언하고 패키지 보호 클래스에 요청을 전달하는 것입니다. –