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

发布于 2024-09-17 07:33:03 字数 173 浏览 7 评论 0原文

有没有提供Java动态代码生成并且还支持泛型的工具?

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

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

Is there any tool which provides Java dynamic code generation and that also supports generics?

Javassist for example, is the kind of tool that I need, but it does not support generics.

I wrote a small lib which uses the Java 6 Compiler API, however as far as I know it depends on JDK. Is there a way to specify another compiler? Or to ship with my application only the parts that I need to invoke with the Java Compiler API?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

多孤肩上扛 2024-09-24 07:33:04

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

http://www.mail-archive.com/ [电子邮件受保护]/msg101222.html

[jboss-user] [Javassist 用户问题] - 回复:使用 Javassist 更改方法的泛型信息
西蒙·林盖特
2007 年 12 月 20 日星期四 12:22:14 -0800

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

你绝对可以使用 javaassist 来做到这一点。关键类是
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);

如果您对阅读其中包含泛型的签名更感兴趣,您可以
可以使用方法Info.getAttribute(SignatureAttribute.tag)。

我希望这有帮助。

It seems you can manipulate and read generic info with Javaassist. See

http://www.mail-archive.com/[email protected]/msg101222.html

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

I have done further reading on how this is implemented by the compiler and
finally found out the answer I was looking for.

You can defenitely do that with javaassist. The key class is
javassist.bytecode.SignatureAttribute.

From a CtMethod, i've obtained the methodInfo I add a Signature attribute. You can do it with something like:

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

If your more interesed in reading the signature with the generics inside, you
can use the methodInfo.getAttribute(SignatureAttribute.tag).

I hope this helped.

笑看君怀她人 2024-09-24 07:33:04

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

If you are comfortable with writing bytecode then ASM is quite a good library for that kind of thing. That will let you generate a class file on the fly without having to worry about the nitty-gritty of the classfile format. You can then use a classloader to dynamically load it into your application.

慵挽 2024-09-24 07:33:04

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

If I recall correctly, it is sufficient to have tools.jar in the classpath in order to use the Java compiler at runtime.

耳钉梦 2024-09-24 07:33:04

实际上,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());

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

Actually, javaassist can handle generics using 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 has a lot of very good examples. Hop they are helpful.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文