以下为本人的学习笔记
1.认识Annotation
JDK1.5开始,java增加了对元数据(即类的组成单元数据)的支持,也就是(Annotation)注解,它是代码里做的特殊标记,这些标记可以在编译,类加载,运行时在不改变原有逻辑的情况下,被读取(通过反射来读取),并执行相应 的处理,通过使用Annotation,程序员可以在源文件中嵌入一些补充从信息。代码分析工具,开发工具和部署工具可以通过这些补充信息进行验证或者进行部署。Annotation类似于修饰符一样被使用,可以用于包,类,构造方法,方法,成员变量,局部变量的声明。
元数据可以说是一个属性,解释数据的数据。如一个属性age的值为18,那么这个解释18的字段age就是元数据。
注解也可以说是一个描述信息,把信息再解析。
注解的本质是标记,他所有的功能都依赖于对于这个注解解释性的代码,通常需要结合反射来编写解释下代码。
注意:
Annotation是一个接口
java.lang.Annotation接口
2.系统定义的Annotation
在JDK1.5之后,在系统中提供了三个Annotation,分别是:@Override(译:覆盖)、@Deprecated(译:已弃用)、@SupperssWarings。
@Override
表示验证当前的方法是否覆盖超类中的方法(即重写父类方法)。如果你一不小心拼写错误,或者方法签名对不上被覆盖的方法,编译器就会发出错误提示
@Deprecated
表示的是一个类或方法已经不再建议继续使用了,标记为已过时
@SupperssWarings
表示关闭不当的编译器警告信息
Annotation说明@SupperssWarings("unchecked")未检查的转化,如集合没有指定类型@SupperssWarings("unused")未使用的变量@SupperssWarings("resource")有泛型未指定类型@SupperssWarings("path")在类路径,原文件路径中有不存在的路径@SupperssWarings("deprecation")使用了某些不赞成使用的类和方法@SupperssWarings("fallthrough")switch语句执行到底没有break关键字@SupperssWarings("serial")某类实现Serializable但是没有定义serialVersionUID这个需要但是不必须的字段@SupperssWarings("rawtypes")没有传递带有泛型的参数@SupperssWarings("all")全部类型的警告(用这一条就够了)
3.自定义Annotation
注解应用三个步骤:
1)编写注解
2)在类上应用注解
3)对应用了注解的类进行反射操作的类
自定义Annotation的语法如下:
访问控制权限@interface Annotation 名称{}
@interface : 定义一个注解的关键字
例如:
public @interface MyAnnotation{}- //1.自定义注解
- //表示该注解的作用范围在运行时存在
- @Retention(RetentionPolicy.RUNTIME)
- //用于生成文档
- @Documented
- //用于表示注解的应用范围(类型,方法,属性,构造器,参数,局部变量,包,Annotation)
- @Target(ElementType.TYPE)
- @Inherited//子类可继承
- public @interface MyAnnotation{
- //定义变量,注意:变量后要加括号(),且调用此注解时必须设置变量名
- public String name();
-
- public int age() default 2;//给变量设置默认值
-
- public String[] like();//定义一个数组,调用此注解时变量名要含大括号{}
-
- public COlor color();//定义一个枚举类型的变量
-
- }
-
- public enum Color{
- RED,GREEN,BLUE;
- }
复制代码- //2.使用注解
- @MyAnnotation(name="wan",like = {"金鱼","草鱼"},color = Color.RED)
- public class Cat{
- private String name;
- private int age;
- public String[] like;
- private Color color;
- ...(构造方法,getter(),setter())
- }
复制代码- public class AnnotationDemo{
- /**
- 反射来处理注解
- */
- @Test
- public void test2(){
- Class<Cat> catClass = Cat.class;
- //获取类上应用的指定注解
- MyAnnotation annotation = CatClass.getAnnotation(MyAnnotation.class);
- //获取注解上变量值
- String name = annotation.name();
- int age = annotation.age();
- Color color = annotation.color();
- String[] like = annotation.like();
- try{
- //通过反射实例化对象,调用对象的方法存储注解上的值
- Cat cat =catClass.newInstance();
- cat.setName(name);
- cat.setAge(age);
- cat.setLike(like);
- cat.setColor(color);
- System.out.println(cat);
- }catch(InstantiationException e){
- e.printStackTrace();
- }catch(IllegalAccessException e){
- e.printStackTrace();
- }
-
- }
-
-
-
- }
复制代码
4.Retention和RetentionPolicy
Annotation要想决定其作用的范围,通过@Retention(译:保持)指定,而Retention指定的范围由RetentionPolicy(policy,译:方针,政策,原则)决定,RetentionPolicy指定了三种范围:
范围说明public static final RetentionPolicy SOURCE在java源程序中存在(提供给编译器使用)public static final RetentionPolicy CLASS在java生成的class存在public static final RetentionPolicy RUNTIEM在java运行的时候存在(我们通常使用这个范围)示例:
@Retention(value = RetentionPolicy.RUNTIME)
public @interface MyAnnotation{
public String name();
}
5.反射与Annotation
一个Annotation真正起作用,必须结合反射机制,在反射中提供了以下的操作方法:
java.lang.reflect.AccessibleObject(供虚拟机使用)
[table][tr]Method说明[/tr][tr][td]public boolean isAnnotationPresent(Class |