Java动态代码生成,支持generics

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

例如,Javassist是我需要的工具,但它不支持generics。

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

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

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

[jboss-user] [Javassist用户问题] – Re:使用Javassist改变方法的generics信息SimonRinguette星期四,2007年12月20日12:22:14 -0800

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

您可以使用javaassist进行defenitely。 关键类是javassist.bytecode.SignatureAttribute。

从CtMethod,我已经获得了methodInfo,我添加了一个Signature属性。 你可以这样做:

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

如果您在阅读内部generics的签名时更加兴趣,可以使用methodInfo.getAttribute(SignatureAttribute.tag)。

我希望这有帮助。

如果您对编写字节码感到满意,那么ASM对于那种事情来说是一个非常好的库。 这样您就可以动态生成类文件,而无需担心类文件格式的细节。 然后,您可以使用类加载器将其动态加载到您的应用程序中。

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

实际上,javaassist可以使用SignatureAttribute处理generics。

 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()); 

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