首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Groovy】MOP 元对象协议与元编程 ( 方法合成引入 | 内部获取 HandleMetaClass )

文章目录 一、方法合成引入 二、内部获取 HandleMetaClass 一、方法合成引入 ---- 在 Groovy 中 , 如果实现了 GroovyInterceptable 接口 , 调用该...动态 | 创建动态 | 为动态增加字段和方法 ) 博客 ; 假如调用Groovy 不存在的方法 , 那么创建一个新的方法 , 注入到 Groovy 中 , 这种方法注入方式就是 " 方法合成..." ; 二、内部获取 HandleMetaClass ---- 注入方法时 , 不能直接在中使用 metaClass 直接获取 MetaClass , 参考 【Groovy】MOP 元对象协议与元编程...( Groovy 内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 ) 博客 , 在内部获取的 metaClass...才能进行方法注入 ; 在内部 , 可以先获取 this 对象 , 先将 this 赋值给 Student 对象变量 , 然后通过 Student 对象获取 metaClass , 此时获取的 MetaClass

23820

GroovyGroovy 动态语言特性 ( Groovy函数实参自动类型推断 | 函数动态参数注意事项 )

文章目录 前言 一、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

72430
您找到你想要的搜索结果了吗?
是的
没有找到

Groovy】MOP 元对象协议与元编程 ( Groovy 内部和外部分别获取 metaClass | 分析获取 metaClass 操作的字节码 | HandleMetaClass 注入方法 )

文章目录 一、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

24620

Groovy 语法 promotion提升和coercion强制转换学习

') == 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!'

66210

Groovy: 使用ExpandoMetaClass动态地向添加方法

使用ExpandoMetaClass动态地向添加方法 我们可以动态地向Groovy中的添加新的行为,比如方法。...所以这意味着一个方法不会添加到源代码中的定义中,而是添加到应用程序已经运行的定义中。 为此,Groovy为所有添加了一个metaClass属性。...我们可以将方法(也是静态的),属性,构造函数分配给metaClass属性,并将定义的行为动态添加到定义中。 在我们添加了行为之后,我们可以创建的新实例并调用方法,构造函数并像以前一样访问属性。...//我们将方法rightShift添加到List。 //实现只是调用List的remove方法 //提供的参数。...assert false } catch (e) { assert e instanceof MissingMethodException }

2K10

Groovy 使用Builder AST 转换为流式API

Groovy 2.3开始,我们可以使用@Builder AST转换轻松地为我们的创建一个流畅的API。 我们可以将注释应用于我们的,结果类文件将具有支持流畅API的所有必要方法。...在Groovy代码中,我们已经可以使用with方法 有一个简洁的方法来设置属性值或使用 命名的构造函数参数。...但是如果我们的需要从Java中使用,那么为Java开发人员提供一个流畅的API来为我们的Groovy做很好。 在下面的示例中,我们将@Builder注释应用于具有一些属性的简单Message。...我们将所有内容保留为默认设置,然后生成的Message文件将有一个新的builder方法,该方法返回一个内部帮助器,我们可以使用它来设置我们的属性。...然后生成的将没有单独的内部帮助器构建器和构建方法。

95350

Java继承的重名static函数浅谈解析调用与分派

今天被实习生问了这么个问题: 在java中,static成员函数是否可以被重写呢? 结论是,你可以在子类中重写一个static函数,但是这个函数并不能像正常的非static函数那样运行。...,当我们用父的实例引用(实际上该实例是一个子类)调用static函数时,调用的是父的static函数。...当一个方法被调用时,JVM首先检查其是不是方法。如果是,则直接调用该方法引用变量所属中找到该方法并执行,而不再确定它是否被重写(覆盖)。...动态分派是用于方法重写的,比如我调用一个A的方法f,如果该类有子类a,那么我以a来调用f的时候,调用的实际是a.f而非A.f。 看起来还真的像动态分派是不是?但是结果不符合啊!...在调用static方法时,编译器就会直接在加载时把其符号引用解析为直接引用,不存在说子类找不到方法之后再去父找这种行为,所以也叫解析调用

1.2K30

Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用其它方法 )

文章目录 一、通过 MetaClass#invokeMethod 方法调用其它方法 二、完整代码示例 一、通过 MetaClass#invokeMethod 方法调用其它方法 ---- 注意在 invokeMethod...方法中 , 不能调用 invokeMethod 方法 , 这样调用肯定会出现无限循环递归 , 导致栈溢出 ; 此处只能通过调用 MetaClass#invokeMethod 方法 , 调用相关函数 ;...通过元对象的 invokeMethod 方法 , 不会导致栈溢出 ; 获取Groovy 的 metaClass , 然后调用 metaClass 的 invokeMethod 方法 , 传入调用对象...invokeMethod 方法 肯定会出现递归调用 , 导致栈溢出 只能通过调用 MetaClass#invokeMethod 方法 , 调用相关函数...调用 hello 方法 // 第二个参数是函数参数 , 如果为 void 则传入 null //student.invokeMethod("hello", null) // 获取 元方法 //MetaMethod

42730

Groovy踩坑记之方法调用八层认识

就是获取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属性定义方法,只能去父找响应的方法。

46820

Groovy 闭包-语法与参数学习-第一篇

当指定一个参数列表时,->字符是必需的,用于将实参闭包体中分离出来。语句部分由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

77620

Groovy 面向对象编程-成员学习-第一篇

介绍 Groovy学习笔记第16篇。接着上一篇介绍的和数据类型,继续学习面向对象的相关知识。 本篇主要是成员的相关知识点学习。 2....Groovy支持两种创建样式: 位置参数的使用方式与Java构造函数的使用方式类似。 命名参数允许您在调用构造函数时指定参数名称。 下面来具体介绍两种构造方式。...2.1 位置参数 要使用位置参数创建对象,相应的需要声明一个或多个构造函数。对于多个构造函数,每个构造函数都必须具有唯一的类型签名。...构造函数也可以使用groovy.transform.TupleConstructor注释添加到中(后面学习注释的时候再介绍)。...当声明无(或无参数)构造函数时,Groovy会用对无参数构造函数调用替换命名构造函数调用,然后对每个提供的命名属性调用setter。

34720

Groovy 面向对象编程-注解学习

就可以自动获取相关参数信息等,这都是通过注解的方式让编译器自动生成了相关的匿名和方法的。 本质上来说,注解就是可以节省部分样板代码,告知编译器我要实现这个功能,你自动帮我实现。 2....class Runner { static T run(Class taskClass) { def tasks = taskClass.newInstance() //获取对象...m.parameterTypes.length == 0) { //判断类属性信息是否有 def onlyIf = m.getAnnotation(OnlyIf) //获取的...只是在Runner运行的时候 配置了传参,然后通过识别注解对象@OnlyIf 然后调用了不同的方法进行赋值操作。 在实际生产和使用中,Runner类属于封装为插件等工具中。...元注解到收集的注解的转换在语义分析编译阶段执行。 除了用收集的注解替换别名之外,元注解还能够处理它们,包括参数。

69720

一文了解微服务低代码实现方式

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,实例化对象,反射调用指定方法。

1.1K20

Groovy语法-List,Array,Maps学习

介绍 本篇为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

1.2K20

在Java 中安全使用接口引用

AbstractCallSite#call(Object) 之后是一个漫长的调用过程,这其中包括一系列重载函数调用和对接口引用callback 的代理等,最终得益于Groovy 的元编程能力,在标准GroovyObject...对象上获取meatClass ,最后使用反射调用接口引用的指定方法,即callback.on() : callback.metaClass.invokeMethod(callback, 'on', null...在Groovy 和Kotlin 中的原理是基本相同的。 因此可以得出结论:编译器将?. 操作符编译成亦或在框架内部调用与if (callback != null) {} 等同效果的代码片段。...这里需要说明一下,我并没有在生成的静态函数中直接对接口引用进行非空判断,而是交给了源码级别的InterfaceBuoy ,我给出的理由是:字节码织入应该尽可能的简单,更复杂的操作应该交给源码级别的,...为了安全使用定义在接口中的函数,我做了这个小工具,目前已经开源,所有代码都可以通过github 获取,希望这个避免空指针的“接口救生圈”能够让你在Java 的海洋中尽情遨游。 ~~原文完~~

1.7K20

在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 的海洋中尽情遨游。

1.8K20
领券