如何更改单个实例的Java方法实现?

时间:2012-11-13 22:14:25

标签: java groovy metaprogramming

更改单个 java对象的方法签名的正确方法是什么。假设我想改变toString方法。

myObject.metaClass.toString = { pritln "hello world" }

看起来这段代码有问题。如果我将我的对象传递给其他Java编译对象,则会调用原始toString

其他solution会创建包装器Object。它与原版有不同的类,所以它不满足我


加了:
1.我无法控制创作过程
2.我不知道对象是如何实例化的

所以没有 groovy方式 来解决这个问题? 唯一的解决方案是创建Java包装器类,包装所有方法并更改一个?这是......

4 个答案:

答案 0 :(得分:4)

如果您想创建一个更改了单个方法的对象,可以使用“匿名类”来实现此目的。

每当创建对象时:

MyClass myObject = new MyClass() {
    public String toString() {
        ...implementation...
    }
}

答案 1 :(得分:3)

你能使用匿名子类吗?这只会覆盖该单个实例中的toString()方法。

MyObject myObject= new MyObject (){
    @Override
    public String toString (){
         println "hello world"
    }
};

答案 2 :(得分:2)

您对metaClass所做的任何更改只对groovy可见。

java不知道metaClass是否存在,所以显然不能调用它定义的任何替换方法

答案 3 :(得分:0)

创建一个扩展原文的包装器:

public class wrapper extends myObject{
    public toString{
        System.out.println("hello world");
    }
}