阅读目录
- 概念
- Java中的常见注解
- 注解的分类
- 自定义注解
- 注解的项目实战
- 注解总结
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.自定注解–也可以看做是我们编写的注解,其他的都是他人编写的注解。
按照功能来分的,还有,元注解–注解的注解。
四、自定注解
自定义注解的语法要求
@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()方法的实现:
运行结果: