java高级--------注解
1.定义
1)注解是JDK1.5引入的新特性,大部分框架都用注解简化代码并提高编码效率
2)Annotation通常在package、Class、Field、Method上,目的是与其他类、成员变量、方法上做标识,已实现一些特定功能
注解的定义:通过@interface关键字进行定义
public @interface MyAnnotation{
}
2.元注解
jdk提供了几个特殊的注解,只能用于注解上面
1)@Target: 表示该注解可以用于什么地方,取值如下
ElementType.ANNOTATION_TYPE 可以给注解进行注解
ElementType.CONSTRUCTOR 可给构造方法进行注解
ElementType.FIELD 可给属性注解
ElementType.LOCAL_VARIABLE 可给局部变量进行注解
ElementType.METHOD 可给方法进行注解
ElementType.PACKAGE 可给包进行注解
ElementType.PARAMETER 可给一个方法内的参数进行注解
ElementType.TYPE 可给类进行注解,比如类、接口、枚举
2)@Retention:表示注解传递存活时间
RetentionPolicy.SOURCE 注解只在源码阶段保留,编译阶段被丢弃
RetentionPolicy.CLASS 注解保留到编译阶段,不会加载到jvm中
RetentionPolicy.RUNTIME 注解在运行时有效,能加载到jvm中(反射经常用到)
3)@Documented: 将注解中的元素包含到javadoc中
4)@Inherited: 允许子类继承父类中的注解
如果父类上有注解@Test,而@Test注解上有@Inherited注解,那么该父类的子类也默认继承@Test注解
3.注解的属性
注解的属性也叫成员变量,注解只有成员变量,没有方法
1.注解的成员变量在注解的定义中以“无参的方法”形式来定义
2.其方法名称定义了该成员变量的名字,其返回值定义了该成员变量的类型
3.注解中可以有默认值,默认值需要以default关键值指定
eg:
@Inherited//表示可被子类继承
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {
String value();
int sex() default 1;// 0男1女
}
注意:
如果一个注解内仅存在一个名字为value的属性时,应用这个注解可以直接将值写在括号内
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface TestAnnoton {
String value();
}
@TestAnnoton("dsd")
public class People {
}
自定义注解编写的规则
1.所有的Annotion会自动继承java.lang.annotation.Annotation,并不能继承别的类或者是接口
2.参数成员只能用public或者default两个访问修饰符
3.参数成员只能用基本数据类型(char,boolean,byte,short,int,long,float,double)和String,Enum,Class
Annotations数据类型,以及这一些类型的数组
4.获取类方法和字段的注解信息,通过java反射技术实现
4.获取类上的注解
public <A extends Annotation> A getAnnotation(Class<A> annotationClass) 通过类型获取注解对象
public Annotation[] getAnnotations() 获取所有注解
public Annotation[] getDeclaredAnnotations() 获取所有类上注解(不包括继承的注解)
eg:
public static void main(String[] args) {
try {
Class<?> aClass = Class.forName("com.annotion.entity.People");
MyAnnotation annotation = aClass.getAnnotation(MyAnnotation.class);
if (annotation != null){
System.out.println(annotation.value() +" "+ annotation.annotationType() + " "+ annotation.sex());
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
5.获取字段上的注解
eg:
Field[] peopleFiles = aClass.getDeclaredFields();
for (Field field : peopleFiles) {
FieldAnnotation fileAnnotation = field.getAnnotation(FieldAnnotation.class);
if (fileAnnotation != null){
System.out.println("Field:"+field.getName()+":"+fileAnnotation.value());
}
}