Search code examples
javareflectionprivatejava-7

Access non-public (java-native) classes from JDK (7)


I want to use the method MethodHandleNatives.getTargetMethod(MethodHandle)AccessibleObject. The class MethodHandleNatives is not public. So does anybody know how I can do that?

I know that its possible to access private methods and fields via reflections, so I am asking, if this is also possible.

Thanks.


Solution

  • I have found a solution.
    It is not straight forward but it works =)

    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();
        }