Can you elaborate how proxy and default methods affects your library to able to 
run with security manager?

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 <[email protected]> 
> 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 <[email protected]> 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 <[email protected]> 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
>>> 
>>> 
>>> 
>> 
> 

Reply via email to