[ https://issues.apache.org/jira/browse/ARIES-1849?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Nicolas Dutertry updated ARIES-1849: ------------------------------------ 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 : {code:java} 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()); } }{code} was: 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 demonstrate the issue : {code:java} 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()); } }{code} > Aries proxy does not work with interface default methods > -------------------------------------------------------- > > Key: ARIES-1849 > URL: https://issues.apache.org/jira/browse/ARIES-1849 > Project: Aries > Issue Type: Bug > Components: Proxy > Affects Versions: proxy-impl-1.1.2 > Reporter: Nicolas Dutertry > Priority: Major > > 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 : > {code:java} > 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()); > } > }{code} -- This message was sent by Atlassian JIRA (v7.6.3#76005)