是否有任何工具可以提供 Java 动态代码生成并且还支持泛型?
例如,Javassist 是我需要的那种工具,但它不支持泛型。
我编写了一个使用 Java 6 Compiler API 的小库,但据我所知,它依赖于 JDK。有没有办法指定另一个编译器?还是只为我的应用程序提供我需要使用 Java 编译器 API 调用的部分?
是否有任何工具可以提供 Java 动态代码生成并且还支持泛型?
例如,Javassist 是我需要的那种工具,但它不支持泛型。
我编写了一个使用 Java 6 Compiler API 的小库,但据我所知,它依赖于 JDK。有没有办法指定另一个编译器?还是只为我的应用程序提供我需要使用 Java 编译器 API 调用的部分?
看来您可以使用 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)。
我希望这会有所帮助。
如果您对编写字节码感到满意,那么ASM是一个很好的库。这将使您可以即时生成类文件,而不必担心类文件格式的细节。然后,您可以使用类加载器将其动态加载到您的应用程序中。
如果我没记错的话,在类路径中有 tools.jar 就足够了,以便在运行时使用 Java 编译器。
实际上,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());
这个项目有很多很好的例子。希望他们很有帮助。