java中注解

一、什么是注解

  注解是jdk5.0引入的新技术!

  注解(Annotation):java中对某一程序片段注释说明、这个注释说明能被其它程序读到并执行相应操作!

二、注解的作用

  1、能对于程序做出解释,并且能被其它相应程序读取并且执行相应操作!

三、注解格式

  @注释名  可以添加一些参数值、例如:@SuppressWarnings(value="unchecked")

四、注解的应用范围

  package、class、method、field等上面。通过反射机制来访问。

五、常用的内置注解

  1、@Override:标记的方法是重写了父类的方法

  2、@Deprecated:标记的方法是表示遗弃、废弃,不建议人们以后去使用,但是能使用

  3、@SuppressWarnings:用来抑制编译时的警告信息

    3.1@SuppressWarnings(value={"unchecked","deprecation"})

六、自定义注解

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

  @interface用来声明一哥注解 格式: public @interface 注解名{定义体}

  自定义注解时,我们一般在在自定义注解前面加元注解(作用:负责注解其它注解)java定义了4个标准的meta_annotation类型,他们被用来提供对其它annotation类型说明,详见java.lang.annotation包(@Target、@Retention、@Document、@Inherited)

    @Target:用于描述注解的使用范围(即:被描述的注解可以用在什么地方)

    

    @Retention

    

 七、综合所学写一个小测试

  该测试可以帮助大家理解ORM框架映射,因为这个是用注解写的一个关于实体类到数据库表的简单映射

  7.1 我们写两个注解、一个注解用来指定实体类映射到数据库中的表的名称,另一个用来指定该实体类中所有字段映射到数据库表的详细信息(包括字段名、字段类型、字段长度)

  

 1 package edu.aeon.annotation;
 2 
 3 import static java.lang.annotation.ElementType.TYPE;
 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(TYPE)
11 /**
12  * @author lzj
13  * @create 2017年11月23日 下午1:13:53
14  * @describe 用来指定注解所对应类映射到数据库中的表名称
15  */
16 public @interface CreateTable {
17     String tableName();
18 }
 1 package edu.aeon.annotation;
 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 /**
12  * @author lzj
13  * @create 2017年11月23日 下午1:17:58
14  * @describe 用于注解实体类中属性到数据库的映射关系
15  */
16 public @interface AeonField {
17     //指定列名
18     String ColumnName();
19     //指定列类型
20     String ColumnType();
21     //指定该列大小长度
22     int ColumnLength();
23 }

  7.2接下来我们简单定义一个实体类、该实体类采用我们刚才定义的两个注解

  

 1 package edu.aeon.entity;
 2 
 3 import edu.aeon.annotation.CreateTable;
 4 import edu.aeon.annotation.AeonField;
 5 
 6 /**
 7  * @author lzj
 8  * @create 2017年11月23日 下午1:14:51
 9  * @describe 简单定义一个实体类
10  */
11 @CreateTable(tableName="t_user")
12 public class T_User {
13     @AeonField(ColumnName="UserId",ColumnType="int", ColumnLength = 10)
14     private int uId;
15     @AeonField(ColumnName="UserName",ColumnType="varchar", ColumnLength = 16)
16     private String uName;
17     @AeonField(ColumnName="UserAge",ColumnType="int", ColumnLength = 3)
18     private int uAge;
19     public int getuId() {
20         return uId;
21     }
22     public void setuId(int uId) {
23         this.uId = uId;
24     }
25     public String getuName() {
26         return uName;
27     }
28     public void setuName(String uName) {
29         this.uName = uName;
30     }
31     public int getuAge() {
32         return uAge;
33     }
34     public void setuAge(int uAge) {
35         this.uAge = uAge;
36     }
37 }

  7.3写一个注解的解析小程序

  

 1 package edu.aeon.annotation.test;
 2 
 3 import java.lang.annotation.Annotation;
 4 import java.lang.reflect.Field;
 5 
 6 import edu.aeon.annotation.AeonField;
 7 import edu.aeon.annotation.CreateTable;
 8 import edu.aeon.entity.T_User;
 9 
10 /**
11  * @author lzj
12  * @create 2017年11月23日 下午1:21:38
13  * @describe 解析注解类信息
14  */
15 public class AnnotationTest {
16 
17     /**
18      * at 2017年11月23日 下午1:21:38 by lzj
19      * @throws SecurityException 
20      * @throws NoSuchFieldException 
21      * @Parameters1
22      * @Returns void
23      */
24     public static void main(String[] args) throws NoSuchFieldException, SecurityException{
25         Class clazz = null;
26         try {
27             clazz = Class.forName("edu.aeon.entity.T_User");
28         } catch (ClassNotFoundException e) {
29             e.printStackTrace();
30         }
31         /**
32          * 获得edu.aeon.entity.T_User类的所有注解信息
33          */
34         Annotation an1[]=clazz.getAnnotations();
35         for(Annotation a:an1) {
36             System.out.println(a);
37         }
38         /**
39          * 获得指定(注解)类的指定注解信息
40          */
41         CreateTable an2=(CreateTable) clazz.getAnnotation(CreateTable.class);
42         System.out.println("表名:"+an2.tableName());
43         /**
44          * 获得指定属性的注解信息
45          */
46         StringBuffer sb=new StringBuffer("create table ");
47         sb.append(an2.tableName()).append(" ( ");
48         /*//获得uName这个属性
49         Field field=clazz.getDeclaredField("uName");*/
50         Field [] field1=clazz.getDeclaredFields();
51         for (Field f : field1) {
52             AeonField af=f.getAnnotation(AeonField.class);
53             sb.append(af.ColumnName()).append(" ").append(af.ColumnType()).append("(").append(af.ColumnLength()).append("),");
54             //System.out.println(af.ColumnName()+"	"+af.ColumnType()+"	"+af.ColumnLength());
55         }
56         //这里拼接sql方式很多,可以采取截取、也可以采取将最后一个逗号替换成右括号
57         String sql=sb.substring(0, sb.lastIndexOf(","))+")";
58         System.out.println(sql);
59         /*//获得uName这个属性所对应的注解(所有信息数据)
60         AeonField aField=field.getAnnotation(AeonField.class);
61         //打印uName属性所对应的注解的详细信息
62         System.out.println("uName属性信息:"+aField.ColumnName()+"---"+aField.ColumnType()+"---"+aField.ColumnLength());
63         */
64         /**
65          * 那么这样我们可以通过获得的表名、表字段及属性来拼接出sql、然后用JDBC执行该sql,去创建表
66          * JDBC执行sql比较简单,格式也比较固定,所以此处省略!
67          */
68         
69     }
70 
71 }

  7.4控制台输出截图附上:

  

将生成的sql拿到数据库执行:

  

到这里我们简单解析出了这个实体类映射到数据库中的对应信息,那么接下来用JDBC去执行这条解析出来的sql语句即可,因为JDBC执行sql的格式比较固定,且比较简单且由于时间原因此处不一一写出来了!

  

如有任何疑问可联系邮箱: 给我发邮件、或直接联系QQ:1584875179 || 点返回首页

原文地址:https://www.cnblogs.com/aeon/p/7884101.html