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




  

原文地址:https://www.cnblogs.com/amazing-eight/p/12410292.html