我意识到这可能是一个已被问及回答的问题,但请耐心等待。
我想知道是否可以使用注释将代码注入到类编译时。经典的例子是为对象的成员生成一个getter和setter。这不是我所需要的,但它可以说明基本的想法。
现在在互联网上我得到的基本答案是否定的,但是这个人做到了:
有谁知道他是怎么做的(如果他真的做了他说的话)?
主要的是他没有使用注释处理器来生成要编译的新java文件。我所知道的这种技术并不适用于我们的目的。
由于
答案 0 :(得分:5)
不支持在编译时修改代码,但似乎可以通过使用不受支持的javac内部API,here是一个引用hanbuy-panno解决方案的帖子,还有一个指向{的链接{3}} ...
答案 1 :(得分:3)
如果您愿意接受黑客攻击,请查看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
,其中包含注释处理器。
为什么不给这个人发电子邮件,问他是否会给你代码?