文章目录 一、方法合成引入 二、类内部获取 HandleMetaClass 一、方法合成引入 ---- 在 Groovy 类中 , 如果实现了 GroovyInterceptable 接口 , 调用该...动态类 | 创建动态类 | 为动态类增加字段和方法 ) 博客 ; 假如调用了 Groovy 类不存在的方法 , 那么创建一个新的方法 , 注入到 Groovy 类中 , 这种方法注入方式就是 " 方法合成..." ; 二、类内部获取 HandleMetaClass ---- 注入方法时 , 不能直接在类中使用 metaClass 直接获取 MetaClass , 参考 【Groovy】MOP 元对象协议与元编程...( Groovy 类内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 ) 博客 , 在类内部获取的 metaClass...才能进行方法注入 ; 在类内部 , 可以先获取 this 对象 , 先将 this 赋值给 Student 对象变量 , 然后通过 Student 对象获取 metaClass , 此时获取的 MetaClass
文章目录 前言 一、Groovy 中函数实参自动类型推断 二、函数动态参数注意事项 三、完整代码示例 前言 Groovy 是动态语言 , Java 是静态语言 ; 本篇博客讨论 Groovy 中 , 函数实参的自动类型推断...; 一、Groovy 中函数实参自动类型推断 ---- 定义两个不同的类 Student 和 Worker , 在类中都定义 hello 方法 ; class Student { def hello...Worker { def hello(){ println "Hello Worker" } } 声明一个方法 , 接收参数 object , 暂不指定参数类型 , 在函数中调用参数对象的...hello 方法 ; void fun(object) { object.hello() } 分别向该 fun 函数中传入 Student 和 Worker 对象 , 则会分别调用对应类中的...), getAt(java.lang.String), each(groovy.lang.Closure), split(groovy.lang.Closure), wait() groovy.lang.MissingMethodException
文章目录 一、Groovy 类内部和外部分别获取 metaClass 二、分析 Groovy 类内部和外部获取 metaClass 操作的字节码 三、使用 HandleMetaClass 注入方法 一、...Groovy 类内部和外部分别获取 metaClass ---- 在 Groovy 类 内部 和 外部获取的 metaClass 是不同的 ; 代码示例 : class Student { def...; 在 Student 对象内部的 methodMissing 方法中 , 获取的 metaClass 类型是 groovy.lang.MetaClassImpl ; 二、分析 Groovy 类内部和外部获取...Internal public void setMetaClass(MetaClass var1) { this.metaClass = var1; } } 在 Student 类内部获取...对象中的属性 ; 不同的调用方式获取的 metaClass 是不同的 ; 三、使用 HandleMetaClass 注入方法 ---- Student 对象内部获取的 groovy.lang.MetaClassImpl
') == true Greeter greeter = { 'Groovy' } as Greeter greeter.hello() //输出:Hello, Groovy 从Groovy 2.2.0...,而无需创建接口的显式实现: assert filter(['Java','Groovy'], { it.contains 'G'} as Predicate) == ['Groovy'] 从Groovy...我们只需要实现那些实际调用的方法,但如果调用的方法在映射中不存在,则会引发MissingMethodException或 UnsupportedOperationException,具体取决于传递给调用的参数...x.g() // MissingMethodException 异常触发 x.g(5) // UnsupportedOperationException 异常触发 异常的类型取决于调用本身: MissingMethodException...Class clazz = Class.forName('Greeter') 尝试使用as关键字对类的引用将失败: greeter = { println 'Hello, Groovy!'
使用ExpandoMetaClass动态地向类添加方法 我们可以动态地向Groovy中的类添加新的行为,比如方法。...所以这意味着一个方法不会添加到源代码中的类定义中,而是添加到应用程序已经运行的类定义中。 为此,Groovy为所有类添加了一个metaClass属性。...我们可以将方法(也是静态的),属性,构造函数分配给metaClass属性,并将定义的行为动态添加到类定义中。 在我们添加了行为之后,我们可以创建类的新实例并调用方法,构造函数并像以前一样访问属性。...//我们将方法rightShift添加到List类。 //实现只是调用List的remove方法 //提供的参数。...assert false } catch (e) { assert e instanceof MissingMethodException }
但是在LoggingHandler中调用了super.on方法。也就是说会调用上一级traits进行处理。 而在这里上一级traits就是DefaultHandler对象。...2.1 内部特征的super使用 如果一个类实现了多个traits,并且实现了super的调用,那么: 如果类实现了另一个特性,则调用将委托给链中的下一个特性。...: trait zin{ void text(){ println("zinyan") super.text() //创建一个超类调用...Caught: groovy.lang.MissingMethodException: No signature of method: java.lang.Object.text() is applicable...), wait(long, int), any() groovy.lang.MissingMethodException: No signature of method: java.lang.Object.text
moduleVersion=1.0 extensionClasses=ThreadExt 对象实例扩展方法 , 在 Groovy 脚本中调用 Thread 静态扩展方法 , Thread.hello{...printf "Hello" } 报如下错误 : HelloCaught: groovy.lang.MissingMethodException: No signature of method...), getId(), yield(), sleep(long), sleep(long), split(groovy.lang.Closure) groovy.lang.MissingMethodException...编译扩展类 , 执行 jar -cf thread.jar -C classes ....将编译后的扩展类字节码文件进行打包 , 执行 groovy -classpath thread.jar ThreadExtApplication.groovy 命令 , 执行 ThreadExtApplication.groovy
从Groovy 2.3开始,我们可以使用@Builder AST转换轻松地为我们的类创建一个流畅的API。 我们可以将注释应用于我们的类,结果类文件将具有支持流畅API的所有必要方法。...在Groovy代码中,我们已经可以使用with方法 有一个简洁的方法来设置属性值或使用 命名的构造函数参数。...但是如果我们的类需要从Java中使用,那么为Java开发人员提供一个流畅的API来为我们的Groovy类做很好。 在下面的示例中,我们将@Builder注释应用于具有一些属性的简单类Message。...我们将所有内容保留为默认设置,然后生成的Message类文件将有一个新的builder方法,该方法返回一个内部帮助器类,我们可以使用它来设置我们的属性。...然后生成的类将没有单独的内部帮助器构建器类和构建方法。
今天被实习生问了这么个问题: 在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。...,当我们用父类的实例引用(实际上该实例是一个子类)调用static函数时,调用的是父类的static函数。...当一个方法被调用时,JVM首先检查其是不是类方法。如果是,则直接从调用该方法引用变量所属类中找到该方法并执行,而不再确定它是否被重写(覆盖)。...动态分派是用于方法重写的,比如我调用一个类A的方法f,如果该类有子类a,那么我以a来调用f的时候,调用的实际是a.f而非A.f。 看起来还真的像动态分派是不是?但是结果不符合啊!...在调用static方法时,编译器就会直接在类加载时把其符号引用解析为直接引用,不存在说子类找不到方法之后再去父类找这种行为,所以也叫解析调用。
文章目录 一、通过 MetaClass#invokeMethod 方法调用类其它方法 二、完整代码示例 一、通过 MetaClass#invokeMethod 方法调用类其它方法 ---- 注意在 invokeMethod...方法中 , 不能调用 invokeMethod 方法 , 这样调用肯定会出现无限循环递归 , 导致栈溢出 ; 此处只能通过调用 MetaClass#invokeMethod 方法 , 调用相关函数 ;...通过元类对象的 invokeMethod 方法 , 不会导致栈溢出 ; 获取该 Groovy 类的 metaClass , 然后调用 metaClass 的 invokeMethod 方法 , 传入调用对象...invokeMethod 方法 肯定会出现递归调用 , 导致栈溢出 只能通过调用 MetaClass#invokeMethod 方法 , 调用相关函数...调用 hello 方法 // 第二个参数是函数参数 , 如果为 void 则传入 null //student.invokeMethod("hello", null) // 获取 元方法 //MetaMethod
.* - groovy.lang.* - groovy.util.* Multi-methods(运行时调度) Groovy调用方法是在运行时进行的选择,是根据参数的类型来获取相应的方法。...Groovy的内部类以及嵌套类遵循java的规范,但是有一定的差异。...静态内部类 class A { static class B {} } new A.B() Groovy推荐使用静态内部类。...当调用参数类型是char的方法时,我们需要明确字符的类,或者确保类型已经转换。..., 16)==10 try { assert Character.digit('a', 16)==10 assert false: 'Need explicit cast' } catch(MissingMethodException
就是获取1s内发出去的请求,然后当做实时QPS输出。 但是在实际使用中,每次输出的QPS只有1,这就特别尴尬了。如果不输出日志信息QPS就是正常的。...0 居然先调用了子类的getTest方法,再去调用的父类方法,太神奇了。...getTest() { println("子类方法 无参数") } 控制台输出如下: 子类方法 无参数 Exception in thread "main" groovy.lang.MissingMethodException...当前方法调用出开始,会寻找最近的方法调用,这里只看方法名是否一致或者符合get+方法名首字母大写的方法尝试寻找符合的方法调用 Groovy语言中,会把闭包和通常变量命令方式无异,而且Groovy语言检查中并不会检查这个...所以会先调用getTest方法。 如果getTest返回void时,那么getTest就是不符合Groovy语言中GET方法,所以在子类找不到test属性定义方法,只能去父类找响应的方法。
当指定一个参数列表时,->字符是必需的,用于将实参从闭包体中分离出来。语句部分由0、1或许多Groovy语句组成。...2.1 闭包作为对象使用 闭包是groovy.lang.Closure类的一个实例,使得它可以像任何其他变量一样被赋值给变量或字段,尽管它是一个代码块: //创建了一个闭包对象,并赋值给了listener...如果你像这样定义一个不带参数的闭包: def code = { 'zinyan.com' } 然后闭包内部的代码只会在你调用闭包时被执行,这可以通过使用变量来完成,就像它是一个常规方法一样: println...// println closureWithOneArg(12345678) //输出: groovy.lang.MissingMethodException: No signature of method...println magicNumber(11)//groovy.lang.MissingMethodException: No signature of method: zinyan$_run_closure1
用于调用聚合对象(例如,集合List对象)的所有项的操作。这相当于对每个项目调用操作并将结果收集到列表中,示例如下: //创建了一个Demo类,两个属性值。...示例如下: def zinyan println(zinyan*.name) //输出 null 同时,该运算符也可以用于实现了Iterable接口的任何类,示例代码如下: //创建了一个Demo类,...示例代码如下: //创建了一个Demo类,两个属性值。...我们传入进去后就会出现下面的错误: Caught: groovy.lang.MissingMethodException: No signature of method: groovy.function...Integer, Integer, Integer, Integer) values: [4, 5, 6, 7] Possible solutions: function(int, int, int) groovy.lang.MissingMethodException
介绍 Groovy学习笔记第16篇。接着上一篇介绍的类和数据类型,继续学习面向对象的相关知识。 本篇主要是类成员的相关知识点学习。 2....Groovy支持两种创建样式: 位置参数的使用方式与Java构造函数的使用方式类似。 命名参数允许您在调用构造函数时指定参数名称。 下面来具体介绍两种构造方式。...2.1 位置参数 要使用位置参数创建对象,相应的类需要声明一个或多个构造函数。对于多个构造函数,每个构造函数都必须具有唯一的类型签名。...构造函数也可以使用groovy.transform.TupleConstructor注释添加到类中(后面学习注释的时候再介绍)。...当声明无(或无参数)构造函数时,Groovy会用对无参数构造函数的调用替换命名构造函数调用,然后对每个提供的命名属性调用setter。
就可以自动获取相关参数信息等,这都是通过注解的方式让编译器自动生成了相关的匿名类和方法的。 本质上来说,注解就是可以节省部分样板代码,告知编译器我要实现这个功能,你自动帮我实现。 2....class Runner { static T run(Class taskClass) { def tasks = taskClass.newInstance() //获取类对象...m.parameterTypes.length == 0) { //判断类属性信息是否有 def onlyIf = m.getAnnotation(OnlyIf) //获取类的...只是在Runner运行的时候 配置了传参,然后通过识别注解对象@OnlyIf 然后调用了不同的方法进行赋值操作。 在实际生产和使用中,Runner类属于封装为插件等工具中。...从元注解到收集的注解的转换在语义分析编译阶段执行。 除了用收集的注解替换别名之外,元注解还能够处理它们,包括参数。
ScriptEngineManager会从ClassLoader中获取所有的ScriptEngineFactories实例 类 • AbstractScriptEngine ScriptEngine的抽象实现类...来开发,甚至可以不使用groovy的特有语法,仅仅通过引入groovy并使用它的动态能力; groovy可以直接调用项目中现有的java类(通过import导入),通过构造函数构造对象并直接调用其方法并返回结果...类 在上一节中集成groovy的好处中提到,groovy可以通过import的方式直接调用java类,直接上代码: package pers.doublebin.example.groovy.script.service...variables中获取对应名称的对象,如果存在再尝试调用其方法。...GroovyClassLoader Groovy官方提供GroovyClassLoader类,支持从文件、url或字符串中加载解析Groovy Class,实例化对象,反射调用指定方法。
介绍 本篇为Groovy学习第五篇,学习Groovy语法中的集合,数组和Map数据结构。 到这篇为止,有关于Groovy的基本语法知识就学习完毕了。下面,让我们进入正文。 2....Lists Groovy使用逗号分隔值列表,用方括号包围来表示列表。Groovy列表是普通的JDK java.util.list,因为Groovy没有定义自己的集合类。...= [1, 2, 3] //如果从左到右计算,那么下标值从0开始 println(numbers.get(1)) //输出结果为2 println(numbers...[0]) // 输出结果为 1 //我们如果想获取最后一位item,也就是从右往左计算 println(numbers[-1]) //可以用负数表示 。...会出现groovy.lang.MissingMethodException: No signature of method: java.util.ArrayList.rightShift() is applicable
AbstractCallSite#call(Object) 之后是一个漫长的调用过程,这其中包括一系列重载函数的调用和对接口引用callback 的代理等,最终得益于Groovy 的元编程能力,在标准GroovyObject...对象上获取meatClass ,最后使用反射调用接口引用的指定方法,即callback.on() : callback.metaClass.invokeMethod(callback, 'on', null...在Groovy 和Kotlin 中的原理是基本相同的。 因此可以得出结论:编译器将?. 操作符编译成亦或在框架内部调用与if (callback != null) {} 等同效果的代码片段。...这里需要说明一下,我并没有在生成的静态函数中直接对接口引用进行非空判断,而是交给了源码级别的InterfaceBuoy 类,我给出的理由是:字节码织入应该尽可能的简单,更复杂的操作应该交给源码级别的类,...为了安全使用定义在接口中的函数,我做了这个小工具,目前已经开源,所有代码都可以通过github 获取,希望这个避免空指针的“接口救生圈”能够让你在Java 的海洋中尽情遨游。 ~~原文完~~
AbstractCallSite#call(Object) 之后是一个漫长的调用过程,这其中包括一系列重载函数的调用和对接口引用callback 的代理等,最终得益于Groovy 的元编程能力,在标准GroovyObject...对象上获取meatClass ,最后使用反射调用接口引用的指定方法,即callback.on() : callback.metaClass.invokeMethod(callback, 'on', null...操作符编译成亦或在框架内部调用与if (callback != null) {} 等同效果的代码片段。Java,Kotlin 和Groovy 在字节码层面的处理方式基本相同。...面向接口的编程方式,使我们有天然的优势可以利用,动态代理正是基于接口,因此我们可以对接口引用添加动态代理并返回代理后的值,这样callback 引用实际指向了动态代理对象,在代理的内部我们借助反射调用callback...为了安全使用定义在接口中的函数,我做了这个小工具,目前已经开源,所有代码都可以通过github 获取,希望这个避免空指针的“接口救生圈”能够让你在Java 的海洋中尽情遨游。
领取专属 10元无门槛券
手把手带您无忧上云