【问题标题】:Can annotations be used for code injection?注解可以用于代码注入吗?
【发布时间】:2009-07-16 09:52:46
【问题描述】:

我知道这可能是一个已经被问及并回答的问题,但请耐心等待。

我想知道是否可以使用注释将代码注入您的类编译时。经典示例是为对象的成员生成 getter 和 setter。这并不完全是我需要的,但它可以说明基本思想。

现在在互联网上,我得到的基本答案是否定的,但是这个人做到了:

link text

有谁知道他是怎么做的(如果他真的按照他说的去做)?

主要是他没有使用注解处理器生成新的java文件进行编译。我知道这种技术,但不适用于我们的目的。

谢谢

【问题讨论】:

标签: java annotations


【解决方案1】:

不支持在编译时修改代码,但似乎可以通过使用不受支持的 javac-internal APIs,here 是引用 hanbuy-panno 解决方案的帖子,还带有指向 code 的链接...

【讨论】:

  • 非常感谢。第二个链接正是我想要的。现在我可以看到他是如何做到的,并决定这样做是好还是坏。
【解决方案2】:

去年我去寻找something similar。没有使用注解处理器或编译器更改类的标准方法,注解 API 文档建议创建装饰器。

如果您愿意接受这些黑客攻击,请查看 Adrian Kuhn 对私有 API 的使用,他在其中 adds Roman numeral literals to Java。这种方法仅限于 Sun javac 编译器,如果您使用其他编译器(如 Eclipse 编译器),则需要实现其他东西。


编辑:对此领域感兴趣的任何人都应该查看Project Lombok

【讨论】:

  • 啊,我明白你将自己限制在某个编译器的意思了。那可能是个问题。感谢您的回复。
【解决方案3】:

你可以这样做,但你不应该修改包含注释的类。 (您链接到的技巧使用编译树 api 来修改正在生成的字节码...)这不受支持,并且可能会在以后的 Java SDK 中加以防范。

正确的做法是生成超类、子类或包装类。

我编写了一组注释,这些注释可以生成 getter/setter 和其他有趣的东西。我生成了一个超类。

http://code.google.com/p/javadude/wiki/Annotations

你可以做类似的事情

package sample;

import com.javadude.annotation.Bean;
import com.javadude.annotation.Property;
import com.javadude.annotation.PropertyKind;

@Bean(properties={
    @Property(name="name"),
    @Property(name="phone", bound=true),
    @Property(name="friend", type=Person.class, kind=PropertyKind.LIST)
}) 
public class Person extends PersonGen {
}

它会为你生成带有字段/getter/setter 和绑定属性支持的 PersonGen。

【讨论】:

  • 感谢您的回复,但正如我在原始问题中所述,在我们的案例中生成其他 java 文件并不是一个理想的解决方案。虽然,我同意使用 compile tree api 也不理想。
  • 任何特定的原因代码生成对您不起作用?请记住,代码树 API 不仅不适合此目的,而且在 APT 文档中明确声明它是非法的。
【解决方案4】:

需要处理注释,因此它要么在编译时使用注释处理器发生,要么在运行时使用反射发生(是的,我知道,在运行时还有更多奇特的方法)。

他绝对是在使用注释处理器,只是它是隐式的。如果未明确设置,javac 命令将在类路径中搜索注释处理器。

既然他用这个命令编译:

javac -cp ~/development/panno/build/hanhuy-panno.jar *.java

我们看到他已经修改了类路径以包含hanhuy-panno.jar,它将包含注释处理器。

为什么不直接给那个人发邮件问问他是否会给你密码?

【讨论】:

  • 是的,我意识到他使用注释处理器来做这件事,问题更多的是他在其中做了什么。我已经给他发了邮件,但我还没有收到回复。谢谢
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 2011-04-24
  • 1970-01-01
相关资源
最近更新 更多