zoukankan      html  css  js  c++  java
  • 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 || 点返回首页

  • 相关阅读:
    [转]按照HashTable动态设定类的属性和字段
    Enterprise Library 3.0 January 2007 CTP 数据访问程序块 _ 图解配置
    用Ad和windsor重构Portal
    ActiveRecordBase借助NHibernate的条件获取实体类对象
    Enterprise Library 3.0 January 2007 CTP 数据访问程序块 _ 系统自带链接字符串加密
    VS2005 SP1时因为安全策略而安装失败!
    [转]ASP.NET 2.0 的内部变化
    VB.NET 实现动态数组
    Making plain binary files using a C compiler (i386+)
    迭代器的使用方法简要介绍(摘自C++Primer)
  • 原文地址:https://www.cnblogs.com/aeon/p/7884101.html
Copyright © 2011-2022 走看看