框架的基础--全面解析java注解

阅读目录

  1. 概念
  2. Java中的常见注解
  3. 注解的分类
  4. 自定义注解
  5. 注解的项目实战
  6. 注解总结

java注解在java 1.5版本引入

一、概念

Java提供一种原程序中的元素关联任何信息和热河元数据的途径和方法。

二、Java中常见注解

  • jdk自带的注解
    这里写图片描述

    @Override 表示覆盖或重写父类的方法;
    @Deprecated 表示该方法已经过时了。 (当方法或类上面有@Deprecated注解时,说明该方法或是类都已经过期不能再用,但不影响以前项目使用,提醒你新替代的方法或是类。如果程序员不小心使用了它的元素,那么编译器会发出警告信息。)
  • 第三方注解
    这里写图片描述
    如andoird中ButterKnife框架的BindView

三、注解的分类

按照运行机制分(注解存在程序的哪个阶段)将注解分为三类:
源码注解(只在源码中存在)、编译注解(在class文件中也存在)、运行时注解(在运行阶段仍然起作用)

  • 源码注解: 注释只在源码中存在,编译成class文件就不存在了。
  • 编译时注解:jdk自带的注解都是编译时注解,注解在源码和.class文件中 都存在。
  • 运行时注解:在运行阶段还起作用,甚至会影响运行逻辑的注解。

按照来源来分的话有如下三类:
1. Jdk自带的注解(Java目前只内置了三种标准注解:@Override、@Deprecated、@SuppressWarnings,以及四种元注解)
2.第三方注解–这一类注解我们解除最多和作用最大的一类
3.自定注解–也可以看做是我们编写的注解,其他的都是他人编写的注解。


按照功能来分的,还有,元注解–注解的注解。

四、自定注解

  1. 自定义注解的语法要求

    @Target(ElementType.METHOD,ElementType.Type)
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface Description{
    
        String desc();
        String author();
        String age() default 18;
    
    }
    • 使用@interface关键字定义注解
    • 成员以无参无异常的方式声明
    • 可以用default为成员制定一个默认值
    • 成员类型是受限的,合法的类型包括原始类型及String,Class,Annotation,Enumeration
    • 如果注解只有一个成员,则成员名必须取名为value(),在使用时可以忽略成员名和赋值号(=)
    • 注解类可以没有成员,没有成员的注解称为标识注解

    2.元注解
    @Target 、@Retention @Inherited @Documented

    • @Target 是注释的作用域: 表示该注解可以用于一个类中的哪些属性及方法上,如果作用域类型有多个用英文逗号分隔

      下面是注解的作用域列表:
      CONSTRUCTOR:构造方法声明
      FIELD: 字段声明
      LOCAL_VARIABLE:局部变量声明
      METHOD:方法声明
      PACKAGE:包声明
      PARAMETER:参数声明
      TYPE:类接口

    • @Retention:表示注解的声明周期

      注解按声明周期有个分类
      SOURCE:只有在源码显示,编译时会丢弃
      CLASS:编译时会记录到class中,运行时忽略
      RUNTIME:运行时存在,可以通过反射读取

    • @Inherited:此注解时标识性的元注解,表示当前注解可以由子注解来继承

    • @Documented:表示成成javadoc的时候会包含注解

    3.使用自定注解
      使用注解的语法:
      @<注解名>(<成员名1>=<成员值1>,<成员名1>=<成员值1>,…)

     @Description(desc="i am eyecolor",author="Mooc boy",age=18)
     public String eyecolor(){
         return "red"
     }
    注解的定义看起来很像接口的定义,事实上,与其他任何java接口一样,注解也会编译成class文件。
    定义注解时,会需要一些元注解(meta-annotation),如@target和@Retention。
    @Target用于定义你的注解用于什么地方(例如是一个方法或一个域)。
    @Retention用于定于该注解在哪一个级别可用,在源代码(SOURCE)、类文件中(CLASS)或者运行时(RUNTIME)。
    

    4.解析注解
       概念:通过反射获取类、函数或成员上运行时注解信息,从而实现动态控制程序运行的逻辑。
    如:

public static void main(String[] args){
    try{
        //使用类加载器加载类
        Class c = Class.forName("com.wadexi.test.Child");
        //2.找到类上边的注释
        boolean isExist = c.AnnotationPresent(Description.class);
        if(isExist){
            Description d = c.getAnnotation(Description.class); 
            System.out.println(d.value());
        }
    }catch(ClassNotFoundException e){
        e.printStackTrace();
    }


}

使用forName()方法加载类,并使用getAnnotation(Description.class)检查该类是否带有@Description注解。
注解的继承只能作用在类上,方法上的注解不会被继承,Interface中的所有注解不会被继承。

五、注解的项目实战

需求:
1. 有一张用户表,字段包括用户ID,用户名,昵称,年龄,性别,所在城市,邮箱,手机号。
2. 方便的对每个字段或字段的组合条件进行检索,并打印出sql。
3. 使用方式要足够简单,见代码实例。

具体实例:
TestClass测试类:
这里写图片描述

首先,考虑代码如何与数据库进行映射。

这里写图片描述

对注解@Table和@Column进行定义:
这里写图片描述

这里写图片描述

接下来考虑query()方法的实现:

这里写图片描述

运行结果:
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值