亲宝软件园·资讯

展开

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类;
^_^感谢阅读

加载全部内容

相关教程
猜你喜欢
用户评论