是否有任何工具可以提供Java动态代码生成并且还支持泛型?
例如,Javassist是我需要的工具,但它不支持泛型。我编写了一个使用Java 6 Compiler API的小型lib,但据我所知它依赖于JDK。有没有办法指定另一个编译器?或者只向我的应用程序提供我需要使用Java Compiler API调用的部分?
答案 0 :(得分:4)
您似乎可以使用Javaassist操作和读取通用信息。参见
http://www.mail-archive.com/jboss-user@lists.jboss.org/msg101222.html
[jboss-user] [Javassist用户问题] - Re:使用Javassist改变方法的泛型信息 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<Ljava/lang/String;>;");
methodInfo.addAttribute(signatureAttribute);
如果您在阅读内部仿制品的签名时更加兴趣,那么 可以使用methodInfo.getAttribute(SignatureAttribute.tag)。
我希望这会有所帮助。
答案 1 :(得分:2)
如果您对编写字节码感到满意,那么ASM对于那种事情来说是一个非常好的库。这样您就可以动态生成类文件,而无需担心类文件格式的细节。然后,您可以使用类加载器将其动态加载到您的应用程序中。
答案 2 :(得分:0)
如果我没记错的话,只要在类路径中使用tools.jar就可以在运行时使用Java编译器。
答案 3 :(得分: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());
This project有很多很好的例子。希望他们会有所帮助。