Hi Eric, I can reproduce the bug, as you said, in ProxyGenerator.generateClassFile() only the instance methods should be collected.
cheers, Rémi ----- Mail original ----- > De: "Eric McCorkle" <e...@metricspace.net> > À: "core-libs-dev" <core-libs-dev@openjdk.java.net> > Envoyé: Lundi 2 Octobre 2017 20:44:26 > Objet: Confirm bug in java.lang.reflect.Proxy wrt static methods in interfaces > Hello everyone, > > A colleague of mine discovered what seems to be a bug in > java.lang.reflect.Proxy#newProxyInstance. I'd like to confirm that this > is indeed incorrect behavior before I go and fix it. > > Consider the following two interfaces: > > interface I1 { > static I1 foo() { > return null; > } > } > > interface I2 { > static I2 foo() { > return null; > } > } > > JLS 9.4.1 states that static methods are not inherited in interfaces, > thus it should be perfectly legal to define some class which inherits I1 > and I2. > > The following proxy creation fails: > > public class ProxyBug { > public static void main(String... args) { > I2 i2 =(I2)Proxy.newProxyInstance( > ClassLoader.getSystemClassLoader(), > new Class[] {I1.class, I2.class}, > new InvocationHandler() { > @Override > public Object invoke(Object proxy, > Method method, > Object[] args) > throws Throwable { > return null; > } > }); > } > } > > The exception generated is as follows: > > Exception in thread "main" java.lang.IllegalArgumentException: methods > with same signature foo() but incompatible return types: [interface I1, > interface I2] > at sun.misc.ProxyGenerator.checkReturnTypes(ProxyGenerator.java:712) > at sun.misc.ProxyGenerator.generateClassFile(ProxyGenerator.java:461) > at sun.misc.ProxyGenerator.generateProxyClass(ProxyGenerator.java:339) > at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:639) > at java.lang.reflect.Proxy$ProxyClassFactory.apply(Proxy.java:557) > at java.lang.reflect.WeakCache$Factory.get(WeakCache.java:230) > at java.lang.reflect.WeakCache.get(WeakCache.java:127) > at java.lang.reflect.Proxy.getProxyClass0(Proxy.java:419) > at java.lang.reflect.Proxy.newProxyInstance(Proxy.java:719) > at ProxyBug.main(ProxyBug.java:19) > > So it would seem that newProxyInstance is incorrectly including static > methods in its check for incompatible return types. > > Can I get someone from core-libs to confirm that this is not intended > before I file a bug and start on the fix?