ToB企服应用市场:ToB评测及商务社交产业平台

标题: java基础-注解 [打印本页]

作者: 用户云卷云舒    时间: 2022-10-28 22:22
标题: java基础-注解
以下为本人的学习笔记
 
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. //1.自定义注解
  2. //表示该注解的作用范围在运行时存在
  3. @Retention(RetentionPolicy.RUNTIME)
  4. //用于生成文档
  5. @Documented
  6. //用于表示注解的应用范围(类型,方法,属性,构造器,参数,局部变量,包,Annotation)
  7. @Target(ElementType.TYPE)
  8. @Inherited//子类可继承
  9. public @interface MyAnnotation{
  10.     //定义变量,注意:变量后要加括号(),且调用此注解时必须设置变量名
  11.    public String name();
  12.    
  13.    public int age() default 2;//给变量设置默认值
  14.    
  15.    public String[] like();//定义一个数组,调用此注解时变量名要含大括号{}
  16.    
  17.    public COlor color();//定义一个枚举类型的变量
  18.    
  19. }
  20. public enum Color{
  21.    RED,GREEN,BLUE;
  22. }
复制代码
  1. //2.使用注解
  2. @MyAnnotation(name="wan",like = {"金鱼","草鱼"},color = Color.RED)
  3. public class Cat{
  4.    private String name;
  5.    private int age;
  6.    public String[] like;
  7.    private Color color;
  8.    ...(构造方法,getter(),setter())
  9. }
复制代码
  1. public class AnnotationDemo{
  2.     /**
  3.         反射来处理注解
  4.     */
  5.     @Test
  6.    public void test2(){
  7.        Class<Cat> catClass = Cat.class;
  8.        //获取类上应用的指定注解
  9.        MyAnnotation annotation = CatClass.getAnnotation(MyAnnotation.class);
  10.        //获取注解上变量值
  11.        String name = annotation.name();
  12.        int age = annotation.age();
  13.        Color color = annotation.color();
  14.        String[] like = annotation.like();
  15.        try{
  16.            //通过反射实例化对象,调用对象的方法存储注解上的值
  17.            Cat cat =catClass.newInstance();
  18.            cat.setName(name);
  19.            cat.setAge(age);
  20.            cat.setLike(like);
  21.            cat.setColor(color);
  22.            System.out.println(cat);
  23.        }catch(InstantiationException e){
  24.            e.printStackTrace();
  25.        }catch(IllegalAccessException e){
  26.            e.printStackTrace();
  27.        }
  28.    }
  29.    
  30.    
  31.    
  32. }    
复制代码
 
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




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4