java.lang.reflect.Proxy and default methods
peter.levart at marand.si
Tue Aug 28 03:32:14 PDT 2012
On Tuesday, August 28, 2012 11:18:55 AM Peter Levart wrote:
> Currently java.lang.reflect.Proxy treats default interface methods the same
> as abstract methods (it passes their invocations to the InvocationHandler),
> which is the right thing to do if current platform interfaces like Iterator
> will have some abstract methods turned into default methods.
> But if at the same time interfaces like Iterable get new default methods,
> libraries that expose proxies to those interfaces will have to be prepared
> (modified) to handle invocations to those new methods.
> Sometimes the library writer might just want to pass default method
> invocations to the default method implementations in the interface. Will
> there be a reflection facility to call super interface methods on the proxy
> instance or is there anything else planned to facilitate this?
One way to do that without support for calling super default methods using
reflection might be to overload java.lang.reflect.Proxy factory methods with
variants that take additional "boolean proxyDefaultMethods" parameter so that
when passed as "true" the proxy will act as currently (pass default method
invocations to InvocationHandler) and when passed as "false", default methods
in interfaces will not be "overriden" in generated Proxy class so that default
implementations in interfaces will take over.
If someone wants to be selective (proxy some default methods and not proxy
others), she could get the desired behaviour by creating a private sub-
interface which re-abstracts selected default methods and use the sub-
interface in the Proxy factory. The same "technique" could be used to resolve
conflicting default methods from multiple interfaces.
Some applications that want to be more dynamic might stil prefer reflective
access to interface super methods in the proxy...
More information about the lambda-dev