1

我正在尝试将代码注入 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
$

注射显然不起作用!

4

1 回答 1

3

Java 没有 metaClass 的概念,因此正如您所见,这在 Java 方面不起作用

于 2013-10-12T16:04:33.777 回答