You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Eric Milles (Jira)" <ji...@apache.org> on 2021/10/29 20:12:00 UTC

[jira] [Assigned] (GROOVY-10301) Closure passed to field annotation fails to find static method of the same class

     [ https://issues.apache.org/jira/browse/GROOVY-10301?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Eric Milles reassigned GROOVY-10301:
------------------------------------

    Assignee: Eric Milles

> Closure passed to field annotation fails to find static method of the same class
> --------------------------------------------------------------------------------
>
>                 Key: GROOVY-10301
>                 URL: https://issues.apache.org/jira/browse/GROOVY-10301
>             Project: Groovy
>          Issue Type: Bug
>          Components: Compiler, groovy-runtime
>    Affects Versions: 3.0.9
>            Reporter: Arthur Sengileyev
>            Assignee: Eric Milles
>            Priority: Major
>
> Closure passed to field annotation fails to find static method of the same class if Compiled to dynamic code.
>  
> Code example, which shows how the same code works for statically compiled class, but fails for precise copy compiled dynamically.
> {code:java}
> import groovy.transform.CompileDynamic
> import groovy.transform.CompileStatic
> import java.lang.annotation.Retention
> import java.lang.annotation.RetentionPolicy
> @Retention(RetentionPolicy.RUNTIME)
> @interface TestInterface {
>     Class<?> value();
> }
> @CompileStatic
> class TestStatic {
>     @TestInterface({o -> method(o)})
>     Map map
>     static String method(Object o) {
>         o?.toString()
>     }
> }
> @CompileDynamic
> class TestDynamic {
>     @TestInterface({o -> method(o)})
>     Map map
>     static String method(Object o) {
>         o?.toString()
>     }
> }
> class TestMain {
>     static void main(String[] args) {
>         TestStatic ts = new TestStatic()
>         TestInterface tsi = ts.getClass().getDeclaredField("map").getAnnotation(TestInterface)
>         Class<?> vcs = tsi.value()
>         if (Closure.isAssignableFrom(vcs)) {
>             Closure closure = (Closure)vcs.newInstance(null, null)
>             println(closure.call("OK"))
>         }
>         TestDynamic td = new TestDynamic()
>         TestInterface tdi = td.getClass().getDeclaredField("map").getAnnotation(TestInterface)
>         Class<?> vcd = tdi.value()
>         if (Closure.isAssignableFrom(vcd)) {
>             Closure closure = (Closure)vcd.newInstance(null, null)
>             println(closure.call("FAILURE")) // Will throw exception
>             // Exception in thread "main" groovy.lang.MissingMethodException: No signature of method: grapp.TestDynamic$_closure1.method() is applicable for argument types: (String) values: [FAILURE]
>         }
>     }
> }
> {code}



--
This message was sent by Atlassian Jira
(v8.3.4#803005)