6

是否有任何工具可以提供 Java 动态代码生成并且还支持泛型?

例如,Javassist 是我需要的那种工具,但它不支持泛型。

我编写了一个使用 Java 6 Compiler API 的小库,但据我所知,它依赖于 JDK。有没有办法指定另一个编译器?还是只为我的应用程序提供我需要使用 Java 编译器 API 调用的部分?

4

4 回答 4

4

看来您可以使用 Javaassist 操作和读取通用信息。看

http://www.mail-archive.com/jboss-user@lists.jboss.org/msg101222.html

[jboss-user] [Javassist 用户问题] - Re: Altering Generics Information of Methods using Javassist SimonRinguette Thu, 20 Dec 2007 12:22:14 -0800

我已经进一步阅读了编译器如何实现这一点,并最终找到了我正在寻找的答案。

你可以用 javaassist 来做这件事。关键类是 javassist.bytecode.SignatureAttribute。

从 CtMethod 中,我获得了添加 Signature 属性的 methodInfo。你可以这样做:

CtMethod method = ....
   MethodInfo methodInfo = method.getMethodInfo();
   SignatureAttribute signatureAttribute = new 
SignatureAttribute(methodInfo.getConstPool(),
   "()Ljava/util/List<Ljava/lang/String;>;");
   methodInfo.addAttribute(signatureAttribute);

如果您对阅读带有泛型的签名更感兴趣,可以使用 methodInfo.getAttribute(SignatureAttribute.tag)。

我希望这会有所帮助。

于 2012-08-01T11:29:54.357 回答
2

如果您对编写字节码感到满意,那么ASM是一个很好的库。这将使您可以即时生成类文件,而不必担心类文件格式的细节。然后,您可以使用类加载器将其动态加载到您的应用程序中。

于 2010-08-30T01:21:04.967 回答
0

如果我没记错的话,在类路径中有 tools.jar 就足够了,以便在运行时使用 Java 编译器。

于 2010-08-29T22:11:08.823 回答
0

实际上,javaassist 可以使用SignatureAttribute.

SignatureAttribute.Type retType = new SignatureAttribute.BaseType(Void.TYPE.getName());
SignatureAttribute.Type[] argType = getArgType();
SignatureAttribute.MethodSignature signature = new SignatureAttribute.MethodSignature(null, argType, retType, null);
method.setGenericSignature(signature.encode());

这个项目有很多很好的例子。希望他们很有帮助。

于 2018-07-25T14:22:48.417 回答