一、常用注解
@Override,@Resource,@Autowired这三个注解在我们的日常开发中都是即为常用的注解
二、如何创建一个自定义注解
在java里用class关键字表示文件是一个类,而用@interface关键字则表示创建的是一个自定义注解
三、元注解
1.@Target
表示注解能放在什么位置上,可以选择的位置列表如下:
ElementType.TYPE:能修饰类、接口或枚举类型
ElementType.FIELD:能修饰成员变量
ElementType.METHOD:能修饰方法
ElementType.PARAMETER:能修饰参数
ElementType.CONSTRUCTOR:能修饰构造器
ElementType.LOCAL_VARIABLE:能修饰局部变量
ElementType.ANNOTATION_TYPE:能修饰注解
ElementType.PACKAGE:能修饰包
2.@Retention
表示注解的生命周期
RetentionPolicy.SOURCE: 注解只在源代码中存在,编译成class之后,就没了。@Override 就是这种注解。
RetentionPolicy.CLASS: 注解在java文件编程成.class文件后,依然存在,但是运行起来后就没了。@Retention的默认值,即当没有显式指定@Retention的时候,就会是这种类型。
RetentionPolicy.RUNTIME: 注解在运行起来之后依然存在,程序可以通过反射获取这些信息,
3.@Inherited
表示这个注解可以被子类继承
4.@Documented
表示当执行javadoc的时候,本注解会生成相关文档
四、自定注解demo
demo将自定义几个注解,定义一个被自定义注解修饰的实体,然后利用类反射得出被修饰实体的相关信息
自定义注解有MyEntity,MyGeneratedValue,MyTableField,MyTableId,MyTableName,被修饰的实体是cat
MyEntity
package note;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Package: note
* @ClassName: MyEntity
* @Author: tanp
* @Description: 标记类为一个实体类
* @Date: 2020/9/14 16:38
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyEntity {
}
MyGeneratedValue
package note;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Package: note
* @ClassName: MyGeneratedValue
* @Author: tanp
* @Description: 主键增长策略
* @Date: 2020/9/14 16:40
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyGeneratedValue {
String strategy();
}
MyTableField
package note;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Package: note
* @ClassName: MyTableFiel
* @Author: tanp
* @Description: 标记实体对应Table的数据库表字段
* @Date: 2020/9/14 16:37
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTableField {
String value();
}
MyTableId
package note;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Package: note
* @ClassName: MyTableId
* @Author: tanp
* @Description: 标注实体对应的主键id字段
* @Date: 2020/9/14 16:39
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTableId {
}
MyTableName
package note;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* @Package: note
* @ClassName: MyTableName
* @Author: tanp
* @Description: 标记实体对应的Table名
* @Date: 2020/9/14 16:36
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyTableName {
String name();
}
cat实体
package note;
/**
* @ClassName: Cat
* @Author: tanp
* @Description: ${description}
* @Date: 2020/9/14 16:48
*/
@MyEntity
@MyTableName(name = "CatTable")
public class Cat {
@MyTableId
@MyTableField(value = "cat_id")
@MyGeneratedValue(strategy = "identity")
private int id;
@MyTableField(value = "cat_name")
private String name;
@MyTableField(value = "cat_color")
private String color;
}
解析类
package note;
import java.lang.reflect.Field;
/**
* @ClassName: TestNote
* @Author: tanp
* @Description: ${description}
* @Date: 2020/9/14 16:48
*/
public class TestNote {
public static void main(String[] args) {
Class<Cat> catClass = Cat.class;
MyEntity catMyEntity = (MyEntity) catClass.getAnnotation(MyEntity.class);
if (catMyEntity == null) {
System.out.println("Cat不是实体类");
} else {
MyTableName myTableName = (MyTableName) catClass.getAnnotation(MyTableName.class);
System.out.println("表格名为:" + myTableName.name());
Field[] feilds = catClass.getDeclaredFields();
for (Field field : feilds) {
MyTableId myTableId1 = field.getAnnotation(MyTableId.class);
if (myTableId1 != null) {
System.out.println("id为"+field.getName());
MyGeneratedValue myGeneratedValue = (MyGeneratedValue)field.getAnnotation(MyGeneratedValue.class);
System.out.println("主键增长的策略为"+myGeneratedValue.strategy());
System.out.println("除去id外,当前实体还有如下字段:");
continue;
}
MyTableField myTableField = (MyTableField)field.getAnnotation(MyTableField.class);
System.out.println("字段"+field.getName()+"对应table字段为:"+myTableField.value());
}
}
}
}