lang
MethodHandle example
public class MethodAccessExampleWithArgs { private final int i; public MethodAccessExampleWithArgs(int i_) { i = i_; } private void bar(int j, String msg) { System.out.println("Private Method 'bar' successfully accessed : " + i + ", " + j + " : " + msg + "!"); } // Using Reflection public static Method makeMethod() { Method meth = null; try { Class[] argTypes = new Class[] { int.class, String.class }; meth = MethodAccessExampleWithArgs.class.getDeclaredMethod("bar", argTypes); meth.setAccessible(true); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (NoSuchMethodException e) { e.printStackTrace(); } catch (SecurityException e) { e.printStackTrace(); } return meth; } // Using method handles public static MethodHandle makeMh() { MethodHandle mh; MethodType desc = MethodType.methodType(void.class, int.class, String.class); try { mh = MethodHandles.lookup().findVirtual( MethodAccessExampleWithArgs.class, "bar", desc); System.out.println("mh=" + mh); } catch (NoAccessException e) { throw (AssertionError) new AssertionError().initCause(e); } return mh; } }
Following, is a class meant to test the two approaches of accessing the private method “bar” :
public class MethodAccessMain { private static void withReflectionArgs() { Method meth = MethodAccessExampleWithArgs.makeMethod(); MethodAccessExampleWithArgs mh0 = new MethodAccessExampleWithArgs(0); MethodAccessExampleWithArgs mh1 = new MethodAccessExampleWithArgs(1); try { System.out.println("Invocation using Reflection"); meth.invoke(mh0, 5, "Jabba the Hutt"); meth.invoke(mh1, 7, "Boba Fett"); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } catch (InvocationTargetException e) { e.printStackTrace(); } } private static void withMhArgs() { MethodHandle mh = MethodAccessExampleWithArgs.makeMh(); MethodAccessExampleWithArgs mh0 = new MethodAccessExampleWithArgs(0); MethodAccessExampleWithArgs mh1 = new MethodAccessExampleWithArgs(1); try { System.out.println("Invocation using Method Handle"); mh.invokeExact(mh0, 42, "R2D2"); mh.invokeExact(mh1, 43, "C3PO"); } catch (Throwable e) { e.printStackTrace(); } } public static void main(String[] args) { withReflectionArgs(); withMhArgs(); } }
Related Article:
References :
- A glimpse at MethodHandle and its usage from our JCG partners at Java 7 Developer Blog
- The Well-Grounded Java Developer