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

时间:2009-07-16 09:52:47

标签: java annotations

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

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

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

link text

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

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

由于

4 个答案:

答案 0 :(得分:5)

不支持在编译时修改代码,但似乎可以通过使用不受支持的javac内部API,here是一个引用hanbuy-panno解决方案的帖子,还有一个指向{的链接{3}} ...

答案 1 :(得分:3)

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

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


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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

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

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

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

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

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