Groovy探索之MOP 十四 对Java类使用Groovy语言的MOP

既然Groovy语言是Java语言的扩展,那么我们在使用Groovy语言的时候,就很难与Java语言真正脱得了干系,那怕我们是在做一个纯Groovy语言的项目,如Grails项目。我们可能在Groovy代码中会用到遗留的Java类和包;也可能是为了性能的原因,我们不得不在Groovy语言中使用到Java类;等等。

如果我们要对于Java类使用Groovy语言的MOP,比如我们想给一个Java类的对象在运行期内添加一个方法。那么我们该怎么办呢?

比如,我们有如下的一个Java类:

//(Java代码)
public class Foo {

public String foo()
{
return "foo";
}

}

我们就可以使用如下的方法在运行期内给它的对象添加一个方法:

//(Groovy代码)
ExpandoMetaClass emc = new ExpandoMetaClass( Foo, false )

emc.hello = {"hello,world!"}

emc.initialize()

上面的代码用来初始化一个“ExpandoMetaClass”对象,然后添加一个方法,然后将这个对象实例化;这些都跟给Groovy对象在运行期内添加一个方法的过程一样,没有什么好多说的。

接下来,我们的代码就和对Groovy对象的操作不一样了,要使用“Proxy”类来包装我们的Java类对象,如下:

def foo = new groovy.util.Proxy().wrap(new Foo())

然后就是给这个对象赋值上面的“ExpandoMetaClass”对象:

foo.setMetaClass(emc)

最后,我们就可以测试了:

println foo.hello()

 

运行结果为:

hello,world!

同样,对于我们上面的Java类,我们也可以使用我们的自定义拦截器来拦截它的动作:

//(Groovy代码)
class FooInterceptor implements Interceptor{

Object beforeInvoke(Object a_object, String a_methodName, Object[] a_arguments)
{
if(a_methodName == 'foo')
{
println 'before invoking function foo'
}
}
boolean doInvoke()
{
return true
}
Object afterInvoke(Object a_object, String a_methodName, Object[] a_arguments, Object
a_result)
{
a_result
}

}

这个拦截器跟我们拦截Groovy类的自定义拦截器是一模一样的。使用这个拦截器的方法也是一样的:

//(Groovy代码)
def proxy = ProxyMetaClass.getInstance(Foo.class);
proxy.interceptor = new FooInterceptor()
proxy.use {
def foo = new Foo()
println foo.foo()
}

 

运行结果为:

before invoking function foo
foo

时间: 2024-09-06 17:46:19

Groovy探索之MOP 十四 对Java类使用Groovy语言的MOP的相关文章

十四种Java开发工具点评

在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美的,就算是老鸟也很难做出选择.在本文中我简要介绍了常见的十四种Java开发工具的特点,管中窥"器",希望能对大家有所帮助. 1.JDK (Java Development Kit) 2.Java Workshop 3.NetBeans 与Sun Java Studio 5 4.Borlan

[JAVA]十四种Java开发工具点评_JSP编程

  在计算机开发语言的历史中,从来没有哪种语言象Java那样受到如此众多厂商的支持,有如此多的开发工具,Java菜鸟们如初入大观园的刘姥姥,看花了眼,不知该何种选择.的确,这些工具各有所长,都没有绝对完美的,就算是老鸟也很难做出选择.在本文中我简要介绍了常见的十四种Java开发工具的特点,管中窥"器",希望能对大家有所帮助. 1.JDK (Java Development Kit) 2.Java Workshop 3.NetBeans 与Sun Java Studio 5 4.Borl

(十四)java中super和this

     super代表的是父类.超类,用在继承中的子类中:this代表对象本身,用在本类中.     super访问的是被子类隐藏的父类的属性或被覆盖的方法,而this访问的是同一类中的成员.     super调用的是父类中的某一个构造函数,而this调用的是本类中其他的构造函数.     super和this都需要位于构造器执行体的第一行,否则编译不通过.但是他们两个不能同时存在,因为this要调用其他的构造函数,而其他的构造函数也有super语句,这就形成了冲突,编译不过.     用t

探索PowerShell(十四) 使用WMI对象的方法_PowerShell

上一篇文章中介绍了WMI的基础内容,主要讲了WMI的属性值的查看,文中还提到,WMI不仅具有属性,还具有方法.这一节就来具体讲一下如何调用WMI对象方法. 通过查看WMI对象,可以发现有不少的类同时具有属性和方法.例如类"Win32_NetworkAdapterConfiguration",j就具有不少的方法和属性,可以使用以下命令查询: Get-WmiObject Win32_NetworkAdapterConfiguration | Get-Member -MemberType M

Groovy探索之MOP 十五 方法名的动态性

到目前为止,我们的<Groovy探索之MOP>系列已经谈到了使用ExpandoMetaClass的方方面面,但值得注意的是,我们通过ExpandoMetaClass给一个类在运行期内添加一个方法,不管是普通方法还是静态方法,我们都是添加一个确定方法名的方法.即我们添加一个方法名为A的方法,然后才能使用这个方法A. 然而,方法名的动态性,其实是我们早已接触过的事情,比如在<Groovy探索之invokeMethod方法>里,我们就可以创建形如"sortByXxxxx()&q

Groovy探索之MOP 十二 方法的调用顺序

我们知道,除了使用hook来拦截方法以外,我们还可以通过各种方式来实现方法.如,我们可以在类里直接实现方法:我们可以通过ExpandoMetaClass在运行期内添加方法:我们还可以通过ExpandoMetaClass在运行期内单独给一个对象添加方法. 所有的这些直接添加方法的途径,如果存在hook的话,都是要被hook拦截的.所以,我们可以说,系统是优先调用hook的. 而hook的调用顺序,我们在上一篇<Groovy探索之MOP 十一 运行期内覆盖invokeMethod>已经谈到过了.

Groovy探索之MOP 十 Interceptor 二

在本系列的<Groovy探索之MOP 九 Interceptor 一>中,我们已经详细的介绍了一个简单的拦截器类的方方面面,使得我们初步有了拦截器的基础.本篇需要在前面的拦截器类的基础上,进一步用拦截器类来实现我们的AOP编程. 首先,我们在本系列的第一篇中,所拦截的方法都是固定的方法.现在,我们需要把它扩展成由拦截器类的使用者来指定被拦截的方法. 先还是给出需要被拦截的类来: class Foo { def test1() { println 'test1' } def test2() {

Groovy探索之MOP 四 使用ExpandoMetaClass来实现Mixin

国内很多的文章都在说Groovy语言的Mixin机制就是Groovy语言的Categories机制.其实,在外面的Blog上,大量有人在讨论Groovy语言应该如何实现它自己的Mixin机制,这就是说明Groovy语言的Mixin机制还没有定型,处在讨论之中.Categories机制当然也能实现部分的Mixin功能,就像Java语言的接口机制,还有组合等等,都能实现部分的Mixin功能.就像C++语言的多继承一样,这些"古老"的机制都能或多或少的实现部分的Mixin功能. 其实,Mix

DockOne微信分享(六十四):基于Docker实现DevOps的一些探索

本文讲的是DockOne微信分享(六十四):基于Docker实现DevOps的一些探索[编者的话]本次分享从DevOps介绍:Docker介绍:基于Docker实现DevOps的优势:Docker化DevOps流水线实例分享等四方面展开. DevOps介绍 DevOps(Deveplopment和Operations的简称),中译为开发运维一体化,可定义为是一种过程.方法.文化.运动或实践,主要是为了通过一条高度自动化的流水线来加强开发和其他IT职能部门之间的沟通和协作,加速软件和服务的交付.