You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@groovy.apache.org by "Radoslav Ivanov (Jira)" <ji...@apache.org> on 2020/09/02 03:38:00 UTC

[jira] [Comment Edited] (GROOVY-9707) TypeChecked: NoSuchMethodError: DefaultGroovyMethods.plus(java.lang.String, java.lang.Object)

    [ https://issues.apache.org/jira/browse/GROOVY-9707?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17188953#comment-17188953 ] 

Radoslav Ivanov edited comment on GROOVY-9707 at 9/2/20, 3:37 AM:
------------------------------------------------------------------

Please find an example, which is reproducing the problem, and let me know what is wrong:
{code:java}
import groovy.lang.GroovyClassLoader;
import groovy.transform.CompileStatic;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer;

import java.util.Arrays;

public class NoSuchMethod {

    public static void main(String[] args) throws Exception {

        String script = "@groovy.transform.TypeChecked\n" +
                        "class NoSuchMethodTest {\n" +
                        "    void invoke() {\n" +
                        "         \" a \" + \" b \"\n" +
                        "    }\n" +
                        "}";

        CompilerConfiguration confiuration = new CompilerConfiguration();
        confiuration.addCompilationCustomizers(new ASTTransformationCustomizer(CompileStatic.class));

        GroovyClassLoader groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), confiuration);

        Class scriptClass = groovyClassLoader.parseClass(script);

        Object scriptObject = scriptClass.getConstructor().newInstance();

        Arrays.stream(scriptClass.getMethods())
                .filter(m -> "invoke".equals(m.getName()))
                .findFirst()
                .get()
                .invoke(scriptObject, null);

    }
}
{code}

And that is the result:
{code}
Exception in thread "main" java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at NoSuchMethod.main(NoSuchMethod.java:32)
Caused by: java.lang.NoSuchMethodError: 'java.lang.String org.codehaus.groovy.runtime.DefaultGroovyMethods.plus(java.lang.String, java.lang.Object)'
	at NoSuchMethodTest.invoke(Script_fd1940e6d51b34678c731fa8457de352.groovy:4)
	... 5 more
{code}



was (Author: rivanov):
Please find an example, which is reproducing the problem, and let me know what is wrong:
{code:java}
import groovy.lang.GroovyClassLoader;
import groovy.transform.CompileStatic;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.customizers.ASTTransformationCustomizer;

import java.util.Arrays;

public class NoSuchMethod {

    public static void main(String[] args) throws Exception {

        String script = "@groovy.transform.TypeChecked\n" +
                        "class NoSuchMethodTest {\n" +
                        "    void invoke() {\n" +
                        "         \" a \" + \" b \"\n" +
                        "    }\n" +
                        "}";

        CompilerConfiguration confiuration = new CompilerConfiguration();
        confiuration.addCompilationCustomizers(new ASTTransformationCustomizer(CompileStatic.class));

        GroovyClassLoader groovyClassLoader = new GroovyClassLoader(Thread.currentThread().getContextClassLoader(), confiuration);

        Class scriptClass = groovyClassLoader.parseClass(script);

        Object scriptObject = scriptClass.getConstructor().newInstance();

        Arrays.stream(scriptClass.getMethods())
                .filter(m -> "invoke".equals(m.getName()))
                .findFirst()
                .get()
                .invoke(scriptObject, null);

    }
}
{code}

> TypeChecked: NoSuchMethodError: DefaultGroovyMethods.plus(java.lang.String, java.lang.Object)
> ---------------------------------------------------------------------------------------------
>
>                 Key: GROOVY-9707
>                 URL: https://issues.apache.org/jira/browse/GROOVY-9707
>             Project: Groovy
>          Issue Type: Bug
>          Components: groovy-runtime
>    Affects Versions: 3.0.5
>            Reporter: Radoslav Ivanov
>            Priority: Major
>
> Looking for advice around resolving a problem after upgrading Groovy from 2.5.9 to 3.0.5. 
> Most of the @TypeChecked scripts start hitting NoSuchMethodError when concatenating two strings ("a" + "b"), which is resolved if @TypeChecked is removed... The removed method's deprecation java doc (in 2.4.7) says to "Use the CharSequence version"...
> {code:java}
> java.lang.NoSuchMethodError: 'java.lang.String org.codehaus.groovy.runtime.DefaultGroovyMethods.plus(java.lang.String, java.lang.Object){code}
> May be I am missing something.. any advice will be appreciated...



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