You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Daniel Sun (Jira)" <ji...@apache.org> on 2019/11/25 23:52:00 UTC

[jira] [Assigned] (GROOVY-9075) The exception message should be more clear when a GroovyObject's metaClass is wrong

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

Daniel Sun reassigned GROOVY-9075:
----------------------------------

    Assignee:     (was: Daniel Sun)

> The exception message should be more clear when a GroovyObject's metaClass is wrong
> -----------------------------------------------------------------------------------
>
>                 Key: GROOVY-9075
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9075
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 2.4.16, 3.0.0-alpha-4, 2.5.6
>            Reporter: Xiaoguang Wang
>            Priority: Major
>          Time Spent: 2h
>  Remaining Estimate: 0h
>
> If a GroovyObject's metaClass is overwritten by mistake, the accesses to the instance may cause an exception with unclear message.
>  
> We have met the problem too many times and have spent a lot of time on debugging (and teaching everyone never to use `BeanUtils.copyProperties`, etc)
>  
> If there is a try-catch (or some other check) in the runtime code and report this problem more clearly, it will save everyone's time to debug. Or, is there any better solution to this problem, eg: check the class type in `MetaClassImpl.setProperty`, `DefaultGroovyMethods.setMetaClass` ?
>  
> {code:java}
> import groovy.transform.CompileStatic
> //@CompileStatic
> class C1 {
>     int x
> }
> //@CompileStatic
> class C2 {
>     int x
> }
> //@CompileStatic
> class TestGroovy {
>     static void main(String[] args) {
>         def c1 = new C1()
>         def c2 = new C2()
>         c1.metaClass = c2.metaClass  //eg: org.springframework.beans.BeanUtils.copyProperties
>         // or c1.setMetaClass(c2.getMetaClass())
>         c1.x += 1  // crash here with unclear exception, but c1.setX() works
>     }
> }
> {code}
>  
> {code:java}
> /*
> without @CompileStatic
> Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>    at java.lang.reflect.Method.invoke(Method.java:498)
>    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
>    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
>    at org.codehaus.groovy.runtime.metaclass.MethodMetaProperty$GetBeanMethodMetaProperty.getProperty(MethodMetaProperty.java:76)
>    at org.codehaus.groovy.runtime.callsite.GetEffectivePogoPropertySite.getProperty(GetEffectivePogoPropertySite.java:85)
>    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callGetProperty(AbstractCallSite.java:299)
> with @CompileStatic
> Exception in thread "main" java.lang.IllegalArgumentException: object is not an instance of declaring class
>    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
>    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
>    at java.lang.reflect.Method.invoke(Method.java:498)
>    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:98)
>    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
>    at groovy.lang.MetaClassImpl.setProperty(MetaClassImpl.java:2726)
>    at groovy.lang.MetaClassImpl.setProperty(MetaClassImpl.java:3785)
>    at C1.setProperty(TestGroovy.groovy)
>    at org.codehaus.groovy.runtime.InvokerHelper.setProperty(InvokerHelper.java:213)
>    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.setProperty(ScriptBytecodeAdapter.java:497)
>  */
> {code}



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