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());
      }
    }




      

  • 相关阅读:
    Mongodb地理位置索引
    PHP中目录解析函数
    PHP中的date函数中时区问题
    PHP 文件上传全攻略
    PHP上传图片重命名6种方案
    C#|executequery要求已打开且可用的connection,连接的当前状态为已关闭
    C#|只有 assignment、call、increment、decrement 和 new 对象表达式可用作语句
    Android报错|Android Call requires API level 19 (current min is 15)
    机器学习|用机器学习预测谁将夺得世界杯冠军(附代码)
    Python|词云wordcloud入门示例
  • 原文地址:https://www.cnblogs.com/amazing-eight/p/12410292.html
Copyright © 2011-2022 走看看