Hi Peter, Thanks for the proposal. This feature has been lacking. When this subject was brought, I also have similiar thought to provide a way in Proxy class for InvocationHandler to invoke a default method (but of course no time to put into it).
I appreciate your contribution and good work. I support to add this feature in a future release. I personally don’t feel comfortable to absorb this small API targetting for JDK 9 (since I don’t have the cycle to shepherd this in the next few months). I may be overly conversative but I won’t take security assessment lightly. Maybe someone else is able to help you move this forward before I am available. Mandy > On Jun 3, 2016, at 7:58 AM, Peter Levart <peter.lev...@gmail.com> wrote: > > Hi, > > Since Java SE 8 introduced default methods in interfaces there was a question > what to do with java.lang.reflect.Proxy API. Nothing was done to the API at > that time, so the default behavior is to proxy default methods too. > InvocationHandler gets invoked for default methods, but it has not provision > to forward such calls to the default implementations in the interfaces. > > I propose a simple API addition that allows calling super default methods in > proxy instances: > > http://cr.openjdk.java.net/~plevart/jdk9-dev/Proxy.invokeSuperDefaults/webrev.02/ > > With this addition one can simply decide in the InvocationHandler what to do > with invocations to default methods and can forward such invocation to the > default implementation: > > public class Test { > > interface I1 { > default void m() { > System.out.println(" default I1.m() called"); > } > } > > interface I2 { > default void m() { > System.out.println(" default I2.m() called"); > } > } > > interface I12 extends I1, I2 { > @Override > void m(); > > default int sum(int a, int b) { > return a + b; > } > > default Object[] concat(Object first, Object... rest) { > Object[] result = new Object[1 + rest.length]; > result[0] = first; > System.arraycopy(rest, 0, result, 1, rest.length); > return result; > } > } > > public static void main(String[] args) { > > InvocationHandler h = (proxy, method, params) -> { > System.out.println("\nInvocationHandler called for: " + method + > " with parameters: " + Arrays.toString(params)); > if (method.isDefault()) { > try { > return Proxy.invokeSuper(proxy, method, params); > } catch (InvocationTargetException e) { > throw e.getCause(); > } > } else { > switch (method.getName()) { > case "m": > System.out.println(" abstract I12.m(): called"); > return null; > default: > throw new UnsupportedOperationException( > "Unsupported method: " + method); > } > } > }; > > I1 i1 = (I1) Proxy.newProxyInstance( > I1.class.getClassLoader(), new Class<?>[]{I1.class}, h); > i1.m(); > > I2 i2 = (I2) Proxy.newProxyInstance( > I2.class.getClassLoader(), new Class<?>[]{I2.class}, h); > i2.m(); > > I12 i12 = (I12) Proxy.newProxyInstance( > I12.class.getClassLoader(), new Class<?>[]{I12.class}, h); > i12.m(); > > System.out.println(" 1 + 2 = " + i12.sum(1, 2)); > System.out.println(" [1] concat [2, 3, 4] = " + > Arrays.toString(i12.concat(1, 2, 3, 4))); > } > } > > > I know FC date is over, but this is really a small change and I have heard > several people that such feature is missing from the Proxy API. > > I'm prepared to create jtreg tests covering the specification if this > proposal is accepted. > > Regards, Peter > > >