Hello,

I am using a closure inside an annotation over an interface method. I then 
decompile the class in intellij (open the .class file essentially) and I see 
that the closure class was created, but I dont see the class definition 
anywhere. I am however able to access it in code. Is this a limitation of 
intellij's decompiler or am I doing something wrong?

    interface InterfaceTest {
        @DataBinding(input = {"Something fishy"})
        void myFunction()
    }

    @Test
    fun test() {
        val clazz = javaClass.classLoader.loadClass("com.process.InterfaceTest")
        val method = clazz.getMethod("myFunction")
        val annotationMethod = 
method.getAnnotation(DataBinding::class.java).input
        val result : Closure<Any> = 
annotationMethod.java.constructors.single().newInstance(null, null) as 
Closure<Any>
        val resultVa = result.call() // This returns Something fishy
    }

When I decompile the class in intellij, I see this

public interface InterfaceTest {
    @com.annotations.DataBinding(input = 
com.process.InterfaceTest._myFunction_closure1.class)
    void myFunction();
}

But I dont see myFunction_closure1 defined anywhere. I am however able to see 
the definition if I change the interface to be a regular class. (this was 
inside the myFunction definition). Is this because intellij assumed that 
myFunction will not have a body and so didnt bother displaying the closure 
class?

        class _myFunction_closure1 extends Closure implements GeneratedClosure {
            public _myFunction_closure1(Object _outerInstance, Object 
_thisObject) {
                super(_outerInstance, _thisObject);
            }

            public Object doCall(Object it) {
                return "Something fishy";
            }

            public Object call(Object args) {
                return this.doCall(args);
            }

            public Object call() {
                return this.doCall((Object)null);
            }

            @Generated
            public Object doCall() {
                return this.doCall((Object)null);
            }
        }

Reply via email to