zoukankan      html  css  js  c++  java
  • java基础系列(三):注解和反射详解

    一,java注解

     1.什么是java注解?

      注解(Annotation)是从jdk5.0引入的技术,可以被其他的程序读取,可以附加在package、class、method、field等上面,相当于给他们添加了额外的辅助信息,通过反射机制可以实现对这些元数据的访问。

     2.元注解

      java定义了4个标准的meta-annotation类型,这些类型和他们所支持的类在java.lang.annotation包中,分别是@Target、@Retention、@Documented、@Inherited

      @Target:描述注解的使用范围(类、方法、字段等)

        常用参数类型:1.TYPE::用在类,接口上。

               2.FIELD:字段。

               3.METHOD:方法。

               4.CONSTRUCTOR:构造器上

      @Retention: 描述注解的生命周期,在什么级别保存注释信息,参数类型:SOURCE<CLASS<RUNTIME.我们通常使用RUNTIME。 

      @Documen:说明该注解将被包含在javadoc中。 

      @Inherited:说明子类可以继承父类中的注解。

    3.内置注解

      @Override:定义在java.lang.Override中,重写超类中的方法。

      @Deprecated:定义在java.lang.Deprecated中,表示不鼓励程序员使用这样的被修饰的元素,但是仍然能使用。

      @SuppressWarnings:定义在java.lang.SuppressWarnings中,用来抑制不同级别编译时的警告信息。

    4.自定义注解

      使用@interface自定义注解时,自动继承了java.lang.Annotation 接口。

      格式 :@interface 注解名{定义内容}

      声明参数:参数类型 参数名字() default value; 注解元素必须要有值,不传值则要定义默认值。当注解元素只有一个时,通常使用value();

     1 public class Test01 {
     2 
     3     @Annotation1(name="haha")        //注意
     4     public static void test01(){
     5         System.out.println(123);
     6     }
     7    
     8     @Annotation2(name="haha",age=14)
     9     public static void test02(){}
    10     
    11 }
    12 
    13 @Target(ElementType.METHOD)
    14 @Retention(RetentionPolicy.RUNTIME)
    15 @interface Annotation1{
    16     String name() default "";
    17 }
    18 
    19 @Target(ElementType.METHOD)
    20 @Retention(RetentionPolicy.RUNTIME)
    21 @interface Annotation2{
    22     String name() default "";
    23     int age() default 0;
    24     String[] hobby() default {"篮球","王者荣耀"};
    25 }

    二,反射原理及代码实现

    3.通过反射获取注解信息

    实例:将一个对象映射到数据库的一条数据

    //1.定义类上注解,
    @Target(ElementType.TYPE)
    @Retention(RetentionPolicy.RUNTIME)
    @interface Tablename{
      String value();
    }
    //2.定义字段上注解
    @Target(ElementType.FIELD)
    @Retention(RetentionPolicy.RUNTIME)
    @interface Fieldattr{
      String name();
      String type();
    }
    //3.定义一个类对象
    @Tablename("t_student")
    public class Student{
      @Fieldattr(name="id",type="int")  
      public int id;
      @Fieldattr(name="name",type="char")
      public String name;
      @Fieldattr(name="age",type="int")
      public int age;

      public static void main(String[] args){
        //获取class对象
        Class c1 = Student.class;
        //获取注解
        Annotation[] annotations = c1.getAnnotations(); //获取的是注解的全类名
        
        Tablename tablename = (Tablename) c1.getAnnotation(Tablename.class);
        System.out.println(tablename.value());//获取注解中参数的值;

        Field name = c1.getDeclaredField("name");
        Fieldattr fieldattr = (Filedattr)name.getAnnotion(Fieldattr.class);
        System.out.println(fieldattr.name());
        System.out.println(fieldattr.type());
      }
    }




      

  • 相关阅读:
    Windows10下Opencv4+CMake+MinGW64+VSC安装教程
    相机标定问题-实践操作流程
    eNSP仿真学习,网络入门!
    SFTP服务的使用!!
    树莓派B+使用入门&RPI库安装&wringPi库安装
    Python基本语法初试
    基于51单片机+DAC0832的信号发生器
    各种标志位的含义
    根文件系统ramdisk.image.gz && uramdisk.image.gz
    Linux中/etc/inittab文件
  • 原文地址:https://www.cnblogs.com/amazing-eight/p/12410292.html
Copyright © 2011-2022 走看看