gpt4 book ai didi

java - 在 Groovy 脚本中声明的类可以在 javassist 中访问吗?

转载 作者:行者123 更新时间:2023-12-01 09:36:24 24 4
gpt4 key购买 nike

我有一个 Groovy 脚本,它声明了某个类。我可以通过 javassist 在同一脚本中访问此类吗?我需要为其创建一个 CtClass 对象。

这是脚本 test.groovy 的示例:

import javassist.*;

public class TestClass {
public String testMethod(String x) {
return x + ".";
}
}

// I can use TestClass now for ordinary operations
TestClass obj = new TestClass();
println(obj.testMethod("a"));

ClassPool pool = ClassPool.getDefault(); // ?
CtClass cc = pool.getCtClass("TestClass"); // this doesn't work

最后一个字符串导致错误:

Caught: javassist.NotFoundException: TestClass
javassist.NotFoundException: TestClass
at javassist.ClassPool.get(ClassPool.java:450)
at javassist.ClassPool.getCtClass(ClassPool.java:515)
at javassist.ClassPool$getCtClass$0.call(Unknown Source)
at test.run(test.groovy:14)

当然可以将此类移出脚本并将其编译为 .class 文件,然后很容易加载它。我认为脚本中也可以再次动态地将此类编译为字节数组或 .class 文件,然后将其加载到 javassist 中。但是,是否可以在不额外(重新)编译此类的情况下完成此操作,并使用我已经可以在普通操作中访问的类?

最佳答案

您可以将自定义代码源注册到 Javassist ClassPool。默认情况下,如果您调用 ClassPool.getDefault(),Javassist 会从类路径中读取类文件。您需要从 Groovy 获取类文件。

实现此目的的一种方法是从 Java 代理读取类文件,该代理允许使用 ClassFileTransformer 读取类文件。另一种方法是挂接到 Groovy 类加载器,该加载器加载脚本,其中所有类都通过 findClass 传递。

关于java - 在 Groovy 脚本中声明的类可以在 javassist 中访问吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38866473/

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