Details
-
Bug
-
Status: Resolved
-
Major
-
Resolution: Fixed
-
proxy-impl-1.1.2
-
None
Description
Since Java 8 it is possible to define default implementations inside interface definition.
It seems that Aries proxy is not compatible with interface default methods. As a result it is not possible to use a blueprint reference to a service implementing an interface with default method.
The following unit test demonstrates the issue :
import java.util.Collections; import org.apache.aries.proxy.UnableToProxyException; import org.apache.aries.proxy.impl.interfaces.InterfaceProxyGenerator; import org.junit.Assert; import org.junit.Test; public class InterfaceProxyGeneratorTest { public static interface Service { String getName(); default String getValue() { return "default"; } } public static class ServiceImpl implements Service { @Override public String getName() { return "serviceimpl"; } @Override public String getValue() { return "value"; } } @Test public void testProxy() throws UnableToProxyException { ServiceImpl serviceImpl = new ServiceImpl(); Assert.assertEquals("serviceimpl", serviceImpl.getName()); Assert.assertEquals("value", serviceImpl.getValue()); Service proxy = (Service)InterfaceProxyGenerator.getProxyInstance( null, null, Collections.singleton(Service.class), () -> { return serviceImpl; }, null); Assert.assertNotNull(proxy); Assert.assertEquals("serviceimpl", proxy.getName()); Assert.assertEquals("value", proxy.getValue()); } }
Attachments
Issue Links
- blocks
-
KARAF-5086 Java 8 default methods cause IncompatibleClassChangeError in blueprint
- Resolved
- links to