注解的定义及使用:
(1)先自定义一些注解,学会定义注解:
测试代码:
package annotationtest;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
public @interface MyAnnotation {
// 定义注解属性,看起来像个方法,实际上是注解的name属性
String name();
// 再定义一个int型属性
int id();
// 还可以给属性加默认值,这个属性用的时候可以不赋值,也可以不写,会自动赋默认值
int age() default 18;
}
@interface MyAnnotation02 {
// 当注解中只有一个属性时,并且属性名定义为value时
// 用的时候,属性名可以省略不写
int value();
}
// 如果希望这个注解只能标注类和方法,使用Target元注解
@Target(value = {ElementType.TYPE, ElementType.METHOD})
// 如果你希望这个注解保存在class文件中,且能被反射机制读取,使用Retention
@Retention(value = RetentionPolicy.RUNTIME)
@interface MyAnnotation03 {
int[] nums();
String[] strs();
Season[] seasons();
}
(2)再来看一下注解怎么使用:
package annotationtest;
public class Test01 {
public static void main(String[] args) {
System.out.println(111);
}
@Override
public String toString() {
return "Test01{}";
}
// @MyAnnotation
public void m1() {
/*
不能用的原因:因为@MyAnnotation注解中有属性值name
用的时候必须给name赋值
*/
}
// 那怎么赋值?这样赋值
@MyAnnotation(name = "张三", id = 1, age = 18)
public void m2() {
}
// 也可以不赋默认值
@MyAnnotation(name = "李四", id = 2)
public void m3() {
}
// 只有一个属性,且属性名为value的时候可以省略不写属性名
@MyAnnotation02(2)
public void m4() {
}
// 当数组元素个数为1个时,数组的大括号可以省略不写
@MyAnnotation03(nums = 1, strs = "hello", seasons = Season.AUTUMN)
public void m5() {
}
// 当数组元素个数不止1个时,数组的大括号就要写了
@MyAnnotation03(nums = {1, 2}, strs = "hello", seasons = {Season.AUTUMN, Season.SPRING})
public void m6() {
}
}
enum Season {
SPRING, SUMMER, AUTUMN, WINTER
}