Java自定义注解
_dafeng 人气:0注解是Java5开始引入的一个概念;不是某一个框架特有的(我刚开始以为是Spring搞出来的-_-),为了搞清楚困扰自己多时的这个疑问,最近特地找了些资料并总结了一下供自己和有缘人翻阅学习;
注解可以看作是一种特殊的标记,可以用在方法、类、参数和包上,程序在编译或者运行时可以检测到这些标记而进行一些特殊的处理,注解仅仅是一个标记;
1. 定义注解
- 修饰符:只能为public,不写时默认为public
- 关键字:@interface
- 注解名:自定义注解名 //如上:Info
- 注解类型元素:注解重的内容 //如上:value, disabled
public @interface Info {
String value() default "";
boolean disabled();
}
2. 修饰注解
定义了一个注解之后,需要给这个自定义注解添加一定的描述,如:可以添加到类上或者方法上,编译期被丢弃呢还是一直存在等;这时需要用到java自带的一组注解:元注解,元注解一共四个
2.1. Target
描述注解可以修饰的Java元素类型,就是这个注解可以用在哪里,类上面还是方法上面或者参数前面
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版本新增,应用于任何使用类型的语句中(例如声明语句、泛型和强制转换语句中的类型) |
2.2. Retention
描述注解的生命周期,就是这个注解啥时候失效,还是一直有效
生命周期类型 | 说明 |
---|---|
RetentionPolicy.SOURCE | 编译时被丢弃,不包含在类文件中 |
RetentionPolicy.CLASS | JVM加载时被丢弃,包含在类文件中,默认值 |
RetentionPolicy.RUNTIME | 由JVM 加载,包含在类文件中,在运行时可以被获取到 |
2.3. Document
描述该注解标记的元素可以被Javadoc 或类似的工具文档化
2.4. Inherited
描述使用了@Inherited注解的注解,所标记的类的子类也会拥有这个注解
3. 案例
自定义注解
@Target({ElementType.TYPE, ElementType.METHOD}) // 可以在标记类或者方法
@Retention(RetentionPolicy.RUNTIME) // 注解保留在程序运行期间,可以通过反射获得注解
public @interface Info {
String value() default "";
boolean disabled();
}
创建实体类,使用注解
//@Info(value="zhangsan") // 不写value时给所有String类型都设置
@Info("zhangsan")
public class User {
private String name;
private int age;
}
利用反射解析注解
public static void main(String[] args) {
try {
//获取User的Class对象
Class clazz = User.class;
//判断person对象上是否有Info注解
if (clazz.isAnnotationPresent(Info.class)) {
System.out.println("User类上配置了Info注解!");
//获取该对象上Info类型的注解
Info infoAnno = (Info) clazz.getAnnotation(Info.class);
System.out.println("user.value :" + infoAnno.value() + ", user.disabled:" + infoAnno.disabled());
} else {
//如果没有注解,或者@Retention(RetentionPolicy.CLASS) 或者@Retention(RetentionPolicy.RESOURCE) 会走这一步
System.out.println("user类上没有配置Info注解!");
}
} catch (Exception e) {
e.printStackTrace();
}
}
输出结果
User类上配置了Info注解!
user.value :zhangsan, user.disabled:false
定义了注解,且在代码中使用了,这时是给使用注解的代码添加了一个标记而已,这时没有任何实际意义,需要单独写代码来识别标记的代码并做处理,如上述代码通过反射获取使用Info注解的User类;
^_^感谢阅读
加载全部内容