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?