1.什么是注解?
简单来说注解是一个特殊的标记符,用于修饰java代码,能被编译器解析,也能在运行时被解析出来。
2.什么是元注解?
元注解就是描述注解的注解。Java提供的元注解有4种
@Target
@Retention
@Documented
@Inherited
@Target 用于描述注解的使用范围(被描述的注解可以用在什么地方)
1.CONSTRUCTOR:用于描述构造器
2.FIELD:用于描述域
3.LOCAL_VARIABLE:用于描述局部变量
4.METHOD:用于描述方法
5.PACKAGE:用于描述包
6.PARAMETER:用于描述参数
7.TYPE:用于描述类,结构 或 enum声明
@Target(ElementType.TYPE)
public @interface Person{}
Person注解可用于注解类,接口,或enum
@Retention 用于定义该注解被保留的时间长短
1.SOURCE:注解信息只有在源文件中有效,在编译后注解信息会被删除点。
2.CLASS:注解信息会在源文件和class文件中保留,不会在虚拟机里。
3.RUNTIME:注解信息会在运行时加载到jvm虚拟机中。在这种情况下,通过反射会得到注解信息。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Person{}
@Documented 用于描述其他类型的annotation时,都会被Javadoc工具文档化,Documented是一个标记注解,没有成员。
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Person{}
@Inherited 用于描述某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的注解类型被用于一个class,则这个注解将被用于该class的子类。
@Inherited
public @interface Animal { }
3.自定义注解
1.使用 @interface关键字自定义注解。
2.所有的方法都没有方法体,只允许piblic 和abstract两种类型。默认是public。
3.注解方法的返回值类型有:基本数据类型,String,Class,enum,注解,上面类型的一维数组。
4.通过default关键字来生命默认值。
自定义注解例子:
创建PersonName注解:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonName {
String name() default "";
}
创建PersonSex注解:
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface PersonSex {
int sex() default 1;
}
使用注解:设置名字为 name为小花, sex为2
public class Person {
@PersonName(name ="小花")
private Stringname;
@PersonSex(sex =2)
private int sex;
public StringgetName() {
return name;
}
public int getSex() {
return sex;
}
}
解析注解:
Class clazz = Person.class;
Field[] fields = clazz.getDeclaredFields();
for (Field f : fields) {
if (f.isAnnotationPresent(PersonName.class)) {
PersonName name = f.getAnnotation(PersonName.class);
System.out.println(name.name());
}else if(f.isAnnotationPresent(PersonSex.class)){
PersonSex sex = f.getAnnotation(PersonSex.class);
System.out.println(sex.sex());
}
}