reference:
在注解的使用中,Java 注解最为经典。Java 5 中引入了注解,支持对源码中的类、方法、变量、参数和包进行注解。虚拟机通过反射技术,可以在运行时获取到注解内容,并将其相关功能动态加入到目标程序的字节码中。如下,通过注解做一系列的定义、声明、赋值
// 等同于 @Edible(value = true)
@Edible(true)
Item item = new Carrot();
public @interface Edible {
boolean value() default false;
}
@Author(first = "Oompah", last = "Loompah")
Book book = new Book();
public @interface Author {
String first();
String last();
}
// 该标注可以在运行时通过反射访问
@Retention(RetentionPolicy.RUNTIME)
// 该标注只用于类内方法
@Target({ElementType.METHOD})
public @interface Tweezable {
}
Java 定义了一套注解,一开始共 7 个,3 个在 java.lang
中,4 个在 java.lang.annotation
中:
@Override // 检查该方法是否是重写方法。如果发现其父类或引用的接口中并没有该方法时,会报编译错误
@Deprecated // 标记过时方法。如果使用该方法,会报编译警告
@SuppressWarnings // 指示编译器忽略注解中声明的警告
@Retention // 标识这个注解怎么保存,是只在代码中,还是编入 class 文件中,或是在运行时通过反射访问
@Documented // 标记这些注解是否包含在用户文档中
@Target // 标记这个注解应该是哪种 Java 成员
@Inherited // 标记这个注解是继承于哪个注解类。默认注解并没有继承于任何子类
@SafeVarargs // Java 7 开始支持,忽略任何使用参数为泛型变量的方法或构造函数调用产生的警告
@FunctionalInterface // Java 8 开始支持,标识一个匿名函数或函数式接口
@Repeatable // Java 8 开始支持,标识某注解可以在同一个声明上使用多次
go:generate
;编译时约束,go:build
。但这不足以作为一个函数注解来使用,也无法形成像 Python 那样的装饰器行为token
供 Parser 使用token
转换为 AST(Abstract Syntax Tree,抽象语法树)供代码生成