注释可以用于代码注入吗?

我意识到这可能是一个被问及回答的问题,但请耐心等待。

我想知道是否可以使用注释将代码注入到类编译时。 经典的例子是为对象的成员生成一个getter和setter。 这不是我所需要的,但它有助于说明基本思想。

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

链接文字

有谁知道他是怎么做的(如果他真的做了他说的话)?

主要的是他没有使用注释处理器来生成要编译的新java文件。 我所知道的这种技术并不适用于我们的目的。

谢谢

在编译时不支持修改代码,但似乎可以通过使用不支持的javac内部API, 这里有一个引用hanbuy-panno解决方案的post,还有代码的链接……

去年我去寻找类似的东西 。 没有标准的方法来使用注释处理器或编译器来更改类,并且注释API文档建议创建装饰器。

如果你愿意忍受黑客攻击,请看看Adrian Kuhn使用私有API,他将罗马数字文字添加到Java中 。 这种方法仅限于Sun javac编译器,如果您使用其他方法(如Eclipse编译器),则需要实现其他方法。


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

您可以这样做,但您不应该修改包含注释的类。 (链接到的技巧使用编译树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 { } 

并且它将使用fields / getters / setter和bound属性支持为您生成PersonGen。

有些东西需要处理注释,所以它要么在编译时使用注释处理器,要么在运行时使用reflection(是的,我知道,在运行时有更多的奇特方式)。

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

因为他使用这个命令来编译:

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

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

为什么不给那个人发电子邮件,问他是否会给你代码?