RFR: 8159746: (proxy) Support for default methods

Peter Levart plevart at openjdk.java.net
Fri Nov 20 10:58:04 UTC 2020


On Wed, 28 Oct 2020 20:13:19 GMT, Rémi Forax <github.com+828220+forax at openjdk.org> wrote:

>> Hi Remi,
>> 
>> I appreciate your proposal to modernize Proxy API.   There are several requests for this enhancement to support default methods in Proxy.   Defining a new `java.lang.invoke.Proxy` is a much bigger project that I can't tell when the existing users of `java.lang.reflect.Proxy` will be able to get this default method invocation support.  
>> 
>> I do agree that this API design has many challenges caused by what you listed above.   Well, I believe we are very close to have a consensus:
>> 1. New `newProxyInstance` factory method takes a handler factory doing the access check
>> 2. Update `getInvocationHandler` to throw `InaccessibleInvocationHandlerException` if access denied to get an invocation handler associated with the proxy instance
>> 
>> If this needs more time, I think I will consider to shelf this RFE and come back to it later (and consider your proposal as well).
>
> The trick is that if we know that a class like java.lang.invoke.Proxy may exist,
> it means that instead of distorting the j.l.r.Proxy API to increase of few percents the performance when calling a default method, you can come with a simpler design in term of API that just add an API point to call a default method.
> 
> Better performance becoming on the the goals of java.lang.invoke.Proxy.

Hi Mandy,
I re-ran the benchmark on your latest version (the static API) and I get similar results as you:

Benchmark               Mode  Cnt   Score   Error  Units
ProxyBench.implClass    avgt    5   3.745 ± 0.033  ns/op
ProxyBench.implProxy    avgt    5  29.826 ± 0.183  ns/op
ProxyBench.ppImplClass  avgt    5   3.683 ± 0.009  ns/op
ProxyBench.ppImplProxy  avgt    5  29.124 ± 0.535  ns/op

I also tried a variant where the access check in the invokeDefault static method in not pre-screened with checking of the interface modifiers and package export status but relies on Method.checkAccess cache:

        // access check
        Class<?> caller = Reflection.getCallerClass();
        int modifiers = method.getModifiers();
        method.checkAccess(caller, intf, proxyClass, modifiers);

... and the results are not worse, even marginally better:

Benchmark               Mode  Cnt   Score   Error  Units
ProxyBench.implClass    avgt    5   3.724 ± 0.012  ns/op
ProxyBench.implProxy    avgt    5  29.138 ± 0.271  ns/op
ProxyBench.ppImplClass  avgt    5   3.744 ± 0.009  ns/op
ProxyBench.ppImplProxy  avgt    5  28.961 ± 0.182  ns/op

I think this looks reasonably good.

-------------

PR: https://git.openjdk.java.net/jdk/pull/313


More information about the core-libs-dev mailing list