注解的写法
@xxx
注解的位置
- 类的上面
- 类成员的上面(包括属性上面、方法上面、构造方法上面)
- 参数前面
注解的作用
- 小部分可用来做注释,为了说明某个属性或方法
- 用来做代码的检查
- 用来携带信息
自定义注解
步骤:
- 创建一个注解(@interface)
- 采用元注解来说明该注解可以放置的位置以及存在的作用域
- 使用自定义注解
创建一个注解
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.CONSTRUCTOR,ElementType.METHOD,ElementType.FIELD})
//用@Target这个元注解来说明注解可以放置的位置,这里为构造函数,方法和属性上面
@Retention(RetentionPolicy.RUNTIME)
//用Retention这个元注解来描述这个注解可以存在内存中
public @interface MyAnnotion {
//@interface说明这是一个注解
String[] value();
//注解中的方法必须有返回值
}
使用自定义注解
public class Person {
@MyAnnotion({"shanmu","jia"})
private String name;
}
注意:
- 将注解放在元素前,传递的参数要与注解类中的方法的返回值一致
- 如果自定义的注解中只有一个方法,方法名是value,则可以省略方法名;如果方法是两个以上,每个方法必须写名字,例上面可表示为value={“shanmu”,“jia”}
- 如果传递的信息是一个数组,数组内只有一个元素,可以省略“{}”
测试是否成功
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class TestMain {
public static void mian(String[] args){
try {
//获得当前类的class
Class clazz=Person.class;
//获得类中的属性
Field field=clazz.getDeclaredField("name");
//获得属性上面的注解对象
Annotation a=field.getAnnotation(MyAnnotion.class);
//获取注解对象对应的class
Class aclazz=a.getClass();
//获得注解中的value方法
Method amethod=aclazz.getMethod("value");
//执行value方法,得到返回值
String[] values=(String[])amethod.invoke(a);
for(String value:values){
System.out.println(value);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果