-
AOP及自定义注解使用
定义
注解是一种能被添加到java源代码中的元数据,方法、类、参数和包都可以用注解来修饰。注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理。
使用
创建注解
- 注解类
@Target({ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documentedpublic
@interface MyAnnotation {
String name() default "Sober清醒";
boolean state() default true;
}
元注解
@Target
类型 | 作用 |
---|---|
ElementType.TYPE | 应用于类、接口(包括注解类型)、枚举 |
ElementType.FIELD | 应用于属性(包括枚举中的常量) |
ElementType.METHOD | 应用于方法 |
ElementType.PARAMETER | 应用于方法的形参 |
ElementType.CONSTRUCTOR | 应用于构造函数 |
ElementType.LOCAL_VARIABLE | 应用于局部变量 |
ElementType.ANNOTATION_TYPE | 应用于注解类型 |
ElementType.PACKAGE | 应用于包 |
ElementType.TYPE_PARAMETER | 1.8版本新增,应用于类型变量 |
ElementType.TYPE_USE | 1.8版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型) |
@Retention
类型 | 作用 |
---|---|
RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
-
@Document
表明该注解标记的元素可以被Javadoc 或类似的工具文档化
创建实体类配置注解
@Data
@MyAnnotationpublic class MyName {
private String name;
}
创建主函数通过反射解析注解
public class main {
public static void main(String[] args) {
try {
MyName myName = new MyName();
Class nameClass = myName.getClass();
//判断对象上是否有注解
if (nameClass.isAnnotationPresent(MyAnnotation.class)) {
//获取该对象上类型的注解
MyAnnotation myAnnotation = (MyAnnotation) nameClass.getAnnotation(MyAnnotation.class);
if (myAnnotation.state()){
System.out.println("类上配置了注解!");
myName.setName(myAnnotation.name());
System.out.println(myName.toString());
}else {
System.out.println("类上注解state为false!");
}
} else {
System.out.println("类上没有配置注解或state为false!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
运行得到结果
类上配置了注解!
MyName(name=Sober清醒)
- 如果此时改变实体类上的注解为
@MyAnnotation(name = "Sober")
则结果为
类上配置了注解!
MyName(name=Sober)
- 再次改变为
@MyAnnotation(name = "Sober",state = false)
则结果为
类上注解state为false!
获取字段上注解
- 更改实体类
@Datapublic
class MyName {
@MyAnnotation(name = "Sober")
private String name;
}
- 修改main方法
public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {
// 获取所有的字段
Field[] fields = MyName.class.getDeclaredFields();
MyName myName = new MyName();
for (Field f : fields) {
// 判断字段注解是否存在
if (f.isAnnotationPresent(MyAnnotation.class)) {
MyAnnotation myAnnotation = f.getAnnotation(MyAnnotation.class);
//通过获取字段名字改为首字母大写拼接set方法名称给对象赋值
MyName.class.getMethod("set"+f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1), String.class)
.invoke(myName,myAnnotation.name());
}
}
System.out.println(myName.toString());
}
- 输出为
MyName(name=Sober)