Java动态代码生成,支持泛型

时间:2010-08-29 21:43:48

标签: java java-compiler-api java-api dynamic-code

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

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

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

4 个答案:

答案 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有很多很好的例子。希望他们会有所帮助。