You beat me to it :D I will see if I can fix it myself (though it's been a some time since I committed any changes).
On 10/02/2017 16:39, mandy chung wrote: > FYI. I created https://bugs.openjdk.java.net/browse/JDK-8188240 for this > issue. > > Mandy > > On 10/2/17 1:33 PM, mandy chung wrote: >> I believe it is a bug. To invoke a static method in the proxy >> interface, it will have to do "I1.foo()" or "I2.foo()". It won't >> invoke through the proxy object, i.e. it's not interceptible. Even >> creating a proxy for I1, the generated proxy class includes an >> instance method named "foo" and no static method is generated in the >> proxy class. >> >> Mandy >> >> On 10/2/17 11:44 AM, Eric McCorkle wrote: >>> 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? >> >