我正在尝试将代码注入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
$
注射显然不起作用!
答案 0 :(得分:3)
Java没有metaClass的概念,所以这不会像你看到的那样在Java端工作