Groovy / Java:JDK类中的方法注入无法从Java中看到

时间:2013-10-12 15:49:39

标签: java groovy code-injection mop

我正在尝试将代码注入JDK类Integer。只要我保留在Groovy中,注入就会起作用,但如果我尝试使用Java客户端中注入的代码则不会。

以下是问题的演示。

以下Groovy代码......

// File: g.groovy
class G {
    public static void init() {
        println 'Constructor injected';
        java.lang.Integer.metaClass.constructor = { i -> 
            println "My constructor called for Integer($i)"
            def constructor = Integer.class.getConstructor(int.class)
            constructor.newInstance(i)
        }
    }

    public static void main(String[] args) {
        G.init();
    }
}

println 'Before injection'
new Integer(1);

G.init()

new Integer(1);

...给我正确的输出:

$ groovy g.groovy
Before injection
Constructor injected
My constructor called for Integer(1)
$

现在,我删除g.groovy以外class G的所有内容:

// File: g.groovy
class G {
    public static void init() {
        println 'Constructor injected';
        java.lang.Integer.metaClass.constructor = { i -> 
            println "My constructor called for Integer($i)"
            def constructor = Integer.class.getConstructor(int.class)
            constructor.newInstance(i)
        }
    }

    public static void main(String[] args) {
        G.init();
    }
}

然后,我编译g.groovy

$ groovyc g.groovy
$ ls *.class
G.class  G$_init_closure1.class
$

然后,我尝试使用来自U.java的注射:

// U.java
public class U {
    public static void main(String[] args) {
        System.out.println("Creating a new integer");
        new Integer(1);

        G.init();

        System.out.println("Creating a new integer");
        new Integer(1);
    }
}

我得到的结果是:

$ javac U.java
$ java -cp .:/path/to/groovy/embeddable/groovy-all-2.1.7.jar U
Creating a new integer
Constructor injected
Creating a new integer
$

注射显然不起作用!

1 个答案:

答案 0 :(得分:3)

Java没有metaClass的概念,所以这不会像你看到的那样在Java端工作