Java 注解
注解的定义
一个简单的例子
public @interface Ano01 {
String name() default "xiaoming";
int age()default 18;
String[] schools() default {"primary school","high school"};
}
和定义接口类似,只是类型设置为@interface,比interface多一个@
然后参数的定义和函数类似,后面加个default代表设置默认值
特殊属性value
-
当注解中只有一个属性且名称是value,在使用注解时给value属性赋值可以直接给属性值,无论value是单值元素还是数组类型。
// 定义注解Book public @interface Book { // 书名 String value(); } // 使用注解Book public class BookShelf { @Book("西游记") public void showBook(){ } } 或 public class BookShelf { @Book(value="西游记") public void showBook(){ } } -
如果注解中除了value属性还有其他属性,且至少有一个属性没有默认值,则在使用注解给属性赋值时,value属性名不能省略。
// 定义注解Book public @interface Book { // 书名 String value(); // 价格 double price() default 100; // 多位作者 String[] authors(); } // 使用Book注解:正确方式 @Book(value="红楼梦",authors = "曹雪芹") public class BookShelf { // 使用Book注解:正确方式 @Book(value="西游记",authors = {"吴承恩","白求恩"}) public void showBook(){ } } // 使用Book注解:错误方式 public class BookShelf { @Book("西游记",authors = {"吴承恩","白求恩"}) public void showBook(){ } } // 此时value属性名不能省略了。
注解属性类型可以有以下列出的类型
- 基本数据类型
- String
- 枚举类型
- 注解类型
- Class类型
- 以上类型的一维数组类型
元注解
元注解就是负责给注解进行注解的注解

@Target和@Retention在这里给@Overide进行修饰
@Target
用于描述注解在可以被标注在什么地方,函数、类、参数等等
可选的参数值在枚举类ElemenetType中包括:
- TYPE: 用在类,接口上
- FIELD:用在成员变量上
- METHOD: 用在方法上
- PARAMETER:用在参数上
- CONSTRUCTOR:用在构造方法上
- LOCAL_VARIABLE:用在局部变量上
@Retention
它表示注解存在阶段是保留在源码(编译期),字节码(类加载)或者运行期(JVM中运行)
可选的参数值在枚举类型RetentionPolicy中包括
- SOURCE:注解只存在于Java源代码中,编译生成的字节码文件中就不存在了。
- CLASS:注解存在于Java源代码、编译以后的字节码文件中,运行的时候内存中没有,默认值。
- RUNTIME:注解存在于Java源代码中、编译以后的字节码文件中、运行时内存中,程序可以通过反射获取该注解。
@Document
与Javadoc有关
@Inherited
@Inherited注解了的注解修饰了一个父类,如果他的子类没有被其他注解修饰,则它的子类也继承了父类的注解。
@Repeatable
说明这个注解可以在一个位置被使用多次
内置注解
| 注解 | 作用 | 注意事项 |
|---|---|---|
| @Override | 它是用来描述当前方法是一个重写的方法,在编译阶段对方法进行检查 | jdk1.5中它只能描述继承中的重写,jdk1.6中它可以描述接口实现的重写,也能描述类的继承的重写 |
| @Deprecated | 它是用于描述当前方法是一个过时的方法 | 无 |
| @SuppressWarnings | 对程序中的警告去除。 | 无 |
获取注解信息
public class Test06 {
public static void main(String[] args) throws Exception {
Class cPerson = Person.class;
Annotation[] annotations = cPerson.getAnnotations();
for (Annotation annotation : annotations){
System.out.println("循环:"+annotation);
}
Annotation myTable = cPerson.getAnnotation(MyTable.class);
System.out.println(myTable);
System.out.println(((MyTable)myTable).value());
Field name = cPerson.getDeclaredField("name");
MyField nameAnnotation = name.getAnnotation(MyField.class);
System.out.println(nameAnnotation);
System.out.println(nameAnnotation.column());
System.out.println(nameAnnotation.type());
System.out.println(nameAnnotation.length());
}
}
@MyTable("person_table")
class Person{
@MyField(column = "col_name",type = "char",length = 20)
private String name;
@MyField(column = "col_age",type = "int",length = 20)
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface MyTable{
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@interface MyField{
String column();
String type();
int length();
}
循环:@com.kehao.MyTable(value=person_table)
@com.kehao.MyTable(value=person_table)
person_table
@com.kehao.MyField(column=col_name, type=char, length=20)
col_name
char
20

浙公网安备 33010602011771号