java-初识注解Annotation

直接通过代码简单了解一下:

  1 package com.etc;
  2 
  3 import java.lang.annotation.ElementType;
  4 import java.lang.annotation.Retention;
  5 import java.lang.annotation.RetentionPolicy;
  6 import java.lang.annotation.Target;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 /*
 11  * 注解不是程序本身,而是对程序作出解释,可以被其他程序读取
 12  * 注解信息可以用来处理流程
 13  * 格式为:@注释名,可以添加参数值
 14  * 如@SuppressWarningss(value="unchecked").
 15  * 可以附加在package,class,method,field等等上面,相当于给他们提供了额外的辅助信息,
 16  * 可以通过反射机制编程实现对这些元数据的访问
 17  */
 18 public class AnnotationDemo1 extends Object{
 19 
 20     public static void main(String[] args) {
 21 
 22         AnnotationDemo1 a=new AnnotationDemo1();
 23         System.out.println(a.toString());
 24         a.test();
 25         a.test2();
 26         a.test3();
 27 
 28     }
 29     
 30     @Override   /*表示该方法为重写父类Object下的toString方法,为内置注解*/
 31     public String  toString() {
 32         return "简单测试";
 33     }
 34 
 35     @Deprecated /*表示不建议程序员使用的方法,为内置注解*/
 36     public void test() {
 37         System.out.println("注解入门!");
 38     }
 39 
 40 
 41     /*
 42      * deprecation :使用了过时的类或过时的方法的警告
 43      * unchecked  :执行了未检查的转换时的警告,如使用泛型时未指定类型
 44      * fallthrough:使用switch语句时发生了case穿透
 45      * path:在类路径,原文件路径等中有不存在路径的警告
 46      * serial:挡在序列化的类上缺少serialVersionUID的警告
 47      * finally:任何finally子句不能完成的警告
 48      * all:关于以上所有情况的警告
 49      * 为内置注解
 50      */
 51     @SuppressWarnings("all")
 52     /*等同于@SuppressWarnings(value="all"),存在多个则改为@SuppressWarnings(value={"unchecked","deprecation"})*/
 53     public void test2() {
 54         List list=new ArrayList();
 55         List list2=new ArrayList();
 56         list.add(1);
 57         list2.add(1);
 58         System.out.println("内置注解测试:"+list.size());
 59     }
 60 
 61     /*
 62      * 自定义注解:    使用@interface自定义注解时-> 自动继承了java.lang.annotation.Annotation接口
 63      * 格式:public @interface 注解名{定义体}
 64      * 其中的每一个方法实际上就是声明了一个配置参数。
 65      * (1)方法的名称就是参数的名称
 66      * (2)返回值就是参数的类型 :返回类型只能是基本类型:Class,String,enum
 67      * (3)可以通过default来声明参数的默认值
 68      * (4)如果只有一个参数成员,一般参数名为value
 69      *  ps:注解元素必须要有值,经常使用空字符串,0作为默认值,也经常使用负数->-1表示不存在的意义
 70      */
 71 
 72     /*元注解:
 73      * 作用:负责注解其他注解,java定义了4个标准的meta-annotation类型,它们被用来提供对其他annotation类型作说明
 74      * 
 75      * @Target:描述注解的使用范围   ->取值方式: @Target(value=ElementType.参数值)
 76      * (1)package包->PACKAGE
 77      * (2)类,接口,枚举,Annotation类型->TYPE
 78      * (3)类型成员(方法,构造方法,成员变量,枚举值)->{构造方法:"CONSTRUCTOR",方法:"METHOD",描述域:"FIELD"}
 79      * (4)方法参数和本地变量->{局部变量:"LOCAL_VARIABLE",描述参数:"PARAMETER"}
 80      * 
 81      * @Retention:表示需要在什么级别保存该注释信息,用于描述注释的生命周期  ->取值方式:@Retention(value=RetentionPolicy.参数值)
 82      * (1)在源文件中有效,源文件保留->SOURCE
 83      * (2)在class文件中有效,class保留->CLASS
 84      * (3)在运行时有效,运行时保留,可以被反射机制读取->RUNTIME
 85      * @Document
 86      * @Inherited
 87      */
 88 
 89     //表示该注解只能用于方法前面
 90     @Target(value=ElementType.METHOD)
 91     //或者直接@Target(ElementType.METHOD)
 92     public @interface start{    
 93     }
 94 
 95     //表示该注释的生命周期只存在于源文件中
 96     @Retention(value=RetentionPolicy.SOURCE)
 97     public @interface over{
 98 
 99     }
100 
101     //表示该注解只能用于方法,类,接口,枚举,Annotation类型前面,生命周期只存在于源文件中
102     @Target(value={ElementType.METHOD,ElementType.TYPE})
103     @Retention(value=RetentionPolicy.SOURCE)
104     public @interface up{
105         //如果不加默认值,需要在加该注释的地方加上默认值
106         String name() ;
107         int id();
108         int age() default 18;
109     }
110 
111     @up(name = "", id = 0)
112     public void test3() {
113         System.out.println("自定义注解简单使用!");
114     }
115 }

效果截图:

实例:利用自定义注解实现数据库与实体类的信息转换

1.实体类

 1 package com.test;
 2 
 3 //利用注解将类与表结构对应,即Person类与数据库表person对应
 4 @Table(value = "person")
 5 public class Person {
 6     //将类属性与表结构中的字段对应
 7     @Field(columName = "pname", len = 20, type = "varchar")
 8     private String name;
 9     
10     @Field(columName = "pid", len = 10, type = "int")
11     private int id;
12     
13     @Field(columName = "birth", len = 20, type = "varchar")
14     private String birth;
15     
16     public String getName() {
17         return name;
18     }
19     public void setName(String name) {
20         this.name = name;
21     }
22     public int getId() {
23         return id;
24     }
25     public void setId(int id) {
26         this.id = id;
27     }
28     public String getBirth() {
29         return birth;
30     }
31     public void setBirth(String birth) {
32         this.birth = birth;
33     }
34 }

2.自定义注解

 1 package com.test;
 2 
 3 import static java.lang.annotation.ElementType.TYPE;
 4 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 5 import java.lang.annotation.Retention;
 6 import java.lang.annotation.Target;
 7 
 8 @Retention(RUNTIME)
 9 @Target(TYPE)
10 public @interface Table {
11     //对应数据库表名
12     String value();
13 }
 1 package com.test;
 2 
 3 import static java.lang.annotation.ElementType.FIELD;
 4 import static java.lang.annotation.RetentionPolicy.RUNTIME;
 5 
 6 import java.lang.annotation.Retention;
 7 import java.lang.annotation.Target;
 8 
 9 @Retention(RUNTIME)
10 @Target(FIELD)
11 public @interface Field {
12     //对应表结构中属性的属性名,属性类型,属性长度
13     String columName();
14     String type();
15     int len();
16 }

3.信息处理类

 1 package com.test;
 2 
 3 import java.lang.annotation.Annotation;
 4 import java.lang.reflect.AnnotatedElement;
 5 
 6 /*
 7  * 之后会使用反射读取注解的信息,模拟处理注解信息的流程
 8  */
 9 public class Reflex {
10 
11     public static void main(String[] args) throws ClassNotFoundException, NoSuchFieldException, SecurityException {
12         
13         Class c=Class.forName("com.test.Person");
14         //获取类的所有有效注解
15         Annotation[] ano=c.getAnnotations();
16         for(Annotation a:ano) {
17             System.out.println(a);
18         }
19         //获得类的指定属性的注解
20         AnnotatedElement f=c.getDeclaredField("name");
21         Field x=f.getAnnotation(Field.class);
22         System.out.println(x.columName()+" "+x.len()+" "+x.type());
23         
24     }
25 
26 }

效果截图:

ps:文章待完善中,如存在问题欢迎大佬指点。

原文地址:https://www.cnblogs.com/weekstart/p/10836980.html