zoukankan      html  css  js  c++  java
  • 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:文章待完善中,如存在问题欢迎大佬指点。

  • 相关阅读:
    C#演练—Windows应用程序—在windows窗体上动态创建上下文菜单
    C#演练—Windows应用程序—可视化继承
    C#演练—Windows应用程序—创建主从windows窗体
    小胖IT大讲堂之三 Hook实战(二) SQL Monitor山寨版
    小胖的2011总结之回忆篇
    Oracle安装示例数据库
    《领域驱动设计》读书笔记(一) 分离领域
    小胖IT大讲堂之一 .NET Reflector工具介绍
    10年前我不是小胖,也是个“诗人”
    忘记
  • 原文地址:https://www.cnblogs.com/weekstart/p/10836980.html
Copyright © 2011-2022 走看看