> On Jun 16, 2016, at 12:29 PM, Mandy Chung <mandy.ch...@oracle.com> wrote: > > Can you elaborate how proxy and default methods affects your library to able > to run with security manager?
So in this particular case, I wanted to create an interface type where some methods are automatically generated from declarative annotations and some are not. interface MyDao { @SqlQuery("SELECT count(1) FROM table WHERE state='foo'") int getFooCount(); @SqlQuery("SELECT count(1) FROM table WHERE state='bar'") int getBarCount(); @InTransaction default getFooAndBarCount() { return getFooCount() + getBarCount(); } } Another use case I have, generating configuration beans from properties: interface SomeConfig { @Config("key.a") int getA(); // required @Config("key.b") default int getB() { return 3; // a nice way to specify the default value } } Neither of these are impossible to work around. But I think the list of situations where this is useful is long and mostly not explored because it is very hard to do so today :) (Specifically about the security manager comment, I am using the workaround outlined in this thread which involves calling setAccessible on the MethodHandle constructor to avoid the unreflectSpecial security check.) > > This is a good enhancement. I have created a JBS issue to track that [1]. > There is no such existing enhancement request in JBS. > > Mandy > [1] https://bugs.openjdk.java.net/browse/JDK-8159746 > >> On Jun 16, 2016, at 11:14 AM, Steven Schlansker <stevenschlans...@gmail.com> >> wrote: >> >> Hi everyone, >> >> I am glad this was discussed on the list again. >> I just wanted to throw out there, as a library developer and >> end user, I now have had to reproduce this hack in no fewer >> than four different projects for various reasons. >> >> It is even worse because it means that my library cannot run >> under a SecurityManager. While this isn't a problem for me >> personally it does limit the utility of any libraries I might produce. >> >> It really is a glaring missing API and if it does not make Java 9 >> I can't imagine I will be the only person that is extremely disappointed. >> >> Thanks, >> Steven >> >>> On Jun 6, 2016, at 1:58 PM, Mandy Chung <mandy.ch...@oracle.com> wrote: >>> >>> 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 >>>> >>>> >>>> >>> >> >