gpt4 book ai didi

java - 常规/Java : Method injection in JDK class not being seen from Java

转载 作者:行者123 更新时间:2023-11-29 05:36:35 26 4
gpt4 key购买 nike

我正在尝试将代码注入(inject) JDK 类 Integer。只要我留在 Groovy 中,注入(inject)就有效,但如果我尝试使用来自 Java 客户端的注入(inject)代码,则注入(inject)无效。

这是问题的演示。

以下 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 的注入(inject):

// 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
$

注入(inject)显然不起作用!

最佳答案

Java 没有元类的概念,因此如您所见,这在 Java 端不起作用

关于java - 常规/Java : Method injection in JDK class not being seen from Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19336141/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com