Confirm bug in java.lang.reflect.Proxy wrt static methods in interfaces

Remi Forax forax at univ-mlv.fr
Mon Oct 2 20:30:32 UTC 2017


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" <eric at metricspace.net>
> À: "core-libs-dev" <core-libs-dev at 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?


More information about the core-libs-dev mailing list