【错误记录】Groovy 扩展方法调用报错 ( 静态扩展方法 或 实例扩展方法 需要分别配置 | 没有配置调用会报错 groovy.lang.MissingMethodException )

简介: 【错误记录】Groovy 扩展方法调用报错 ( 静态扩展方法 或 实例扩展方法 需要分别配置 | 没有配置调用会报错 groovy.lang.MissingMethodException )

文章目录

一、报错信息

二、解决方案





一、报错信息


定义 Thread 扩展方法 , 下面的扩展方法


class ThreadExt {
    public static Thread hello(Thread self, Closure closure) {
        closure()
        return self
    }
}


在 src\main\groovy\manifest\META-INF\services\org.codehaus.groovy.runtime.ExtensionModule 配置文件中 , 只配置了


moduleName=groovyExt
moduleVersion=1.0
extensionClasses=ThreadExt


对象实例扩展方法 , 在 Groovy 脚本中调用 Thread 静态扩展方法 ,


Thread.hello{
    printf "Hello"
}



报如下错误 :


HelloCaught: groovy.lang.MissingMethodException: No signature of method: static java.lang.Thread.hello() is applicable for argument types: (ThreadExtApplication$_run_closure2) values: [ThreadExtApplication$_run_closure2@1ab06251]
Possible solutions: hello(groovy.lang.Closure), getId(), yield(), sleep(long), sleep(long), split(groovy.lang.Closure)
groovy.lang.MissingMethodException: No signature of method: static java.lang.Thread.hello() is applicable for argument types: (ThreadExtApplication$_run_closure2) values: [ThreadExtApplication$_run_closure2@1ab06251]
Possible solutions: hello(groovy.lang.Closure), getId(), yield(), sleep(long), sleep(long), split(groovy.lang.Closure)
        at ThreadExtApplication.run(ThreadExtApplication.groovy:5)






二、解决方案


在 src\main\groovy\manifest\META-INF\services\org.codehaus.groovy.runtime.ExtensionModule 配置文件中 , 同时配置静态和实例扩展方法 ;


moduleName=groovyExt
moduleVersion=1.0
extensionClasses=ThreadExt
staticExtensionClasses=ThreadExt


执行


groovyc -d classes ThreadExt.groovy


编译扩展类 , 执行


jar -cf thread.jar -C classes . -C manifest/ .


将编译后的扩展类字节码文件进行打包 , 执行


groovy -classpath thread.jar ThreadExtApplication.groovy


命令 , 执行 ThreadExtApplication.groovy 脚本文件 ;

image.png


目录
相关文章
|
4月前
|
编译器 Java
Java编译器注解运行和自动生成代码问题之重写init方法的问题如何解决
Java编译器注解运行和自动生成代码问题之重写init方法的问题如何解决
|
4月前
|
Java Maven 编译器
Java编译器注解运行和自动生成代码问题之RoundEnvironment和注解类型集合有什么区别
Java编译器注解运行和自动生成代码问题之RoundEnvironment和注解类型集合有什么区别
|
6月前
|
Java 程序员
java8新特性之--函数式接口加方法引用与构造器引用详细讲解
java8新特性之--函数式接口加方法引用与构造器引用详细讲解
53 0
|
监控 Java 容器
字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
在上一篇 「Helloworld」 中,我们初步尝试使用了 Javassist字节编程的方式,来创建我们的方法体并通过反射调用运行了结果。大致了解到创建在使用字节码编程的时候基本离不开三个核心类;ClassPool、CtClass、CtMethod,它们分别管理着对象容器、类和方法。但是我们还少用一样就是字段;CtFields,在这一章节中我们不止会使用字段,还会创建多个不同入参类型和返回值的学习。
392 0
字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
201 0
【Groovy】Groovy 扩展方法 ( 扩展静态方法示例 | 扩展实例方法示例 | 扩展实例方法与扩展静态方法代码相同 )
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
285 0
【Groovy】Groovy 方法调用 ( 使用闭包创建接口对象 | 接口中有一个函数 | 接口中有多个函数 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
197 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 动态拦截函数 | 动态获取 MetaClass 中的方法 | evaluate 方法执行Groovy脚本 )
|
Java
【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )
【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )
214 0
【Groovy】Groovy 动态语言特性 ( Groovy 中的变量自动类型推断以及动态调用 | Java 中必须为变量指定其类型 )
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(一)
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(一)
266 0
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(一)
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(二)
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(二)
173 0
【Groovy】编译时元编程 ( ASTTransformation#visit 方法中访问 Groovy 类、方法、字段、属性 | 完整代码示例及进行编译时处理的编译过程 )(二)