资讯专栏INFORMATION COLUMN

java注解初步学习

KnewOne / 2524人阅读

摘要:定义注解,也叫元数据。它可以声明在包类字段方法局部变量方法参数等的前面,用来对这些元素进行说明,注释。方法返回该程序元素上存在的所有注解。与此接口中的其他方法不同,该方法将忽略继承的注释。

定义:
注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK5.0及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。
它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。(“java注解”百度百科)

作用分类:
①编写文档:通过代码里标识的元数据生成文档
②代码分析:通过代码里标识的元数据对代码进行分析
③编译检查:通过代码里标识的元数据让编译器能过实现基本的编译检查

元注解:
元注解的作用就是注解其他注解。java5.0定义了4个标准的meta-annotation类型,用以对其他的annotation类型做说明,他们分别是:

@Target:
说明了Annotation所修饰的对象的作用:用户描述注解的使用范围(即:被描述的注解可以用在什么地方)
取值(ElementType)有:
 1.CONSTRUCTOR:用于描述构造器
 2.FIELD:用于描述域
 3.LOCAL_VARIABLE:用于描述局部变量
 4.METHOD:用于描述方法
 5.PACKAGE:用于描述包
 6.PARAMETER:用于描述参数
 7.TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention:
作用:表示需要在什么级别保存该注释信息,用于描述注解的生命周期(即:被描述的注解在什么范围内有效)
取值(RetentionPolicy)
1.SOURCE:在源文件中有效
2.CLASS:在class文件中有效
3.RUNTIME:在运行时有效
取RUNTIME时,注解处理器可以通过反射,获取到该注解的属性值,做一些运行时的逻辑处理。

@Documented:
这是一个标记注解
用于描述其它类型的annotation应该被作为标注的程序成员的公共api,可以文档化

@Inherited:
标记注解
用该注解修饰的注解,会被子类继承。

自定义注解:

使用@interface来声明一个注解。其中的每一个方法实际上是声明了一个配置参数。方法的名称就是参数的名称。返回值的类型就是参数的类型。(返回值只能是基本类型、class、String、enum),可以用default来声明参数的默认值.

格式
public @interface 注解名 {定义体}
注解参数支持的数据类型:
1.所有基本数据类型(int,float,boolean,byte,double,char,long,short)
2.String类型
3.Class类型
4.enum类型
5.Annotation类型
6.以上所有类型的数组
只能用public或者default这两个访问权修饰.注解元素必须有确定的默认值,要么在定义的时候指定,要么在使用的时候指定。

例子:

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

//用于描述域
@Target(ElementType.FIELD)
// 运行是有效
@Retention(RetentionPolicy.RUNTIME)
public @interface Student {
    public enum Sex {
        MAN, WOMAN
    }

    /**
     * 1.参数成员只能用基本类型String,Enum,Class,annotations等数据类型,以及这一些类型的数组
     * 2.只能用public或默认(default)这两个访问权修饰. 3.如果只有一个参数成员,最好把参数名称设为"value"
     */
    String name() default "";

    // public修饰
    public int age() default 18;

    public Sex sex() default Sex.MAN;

}

注解处理器

这是一个自己编写的工具类,通过注解处理器对程序元素中的注解进行操作。
获得Annotation信息的方法:
方法1: T getAnnotation(Class annotationClass): 返回改程序元素上存在的、指定类型的注解,如果该类型注解不存在,则返回null。

方法2:Annotation[] getAnnotations():返回该程序元素上存在的所有注解。

方法3:boolean is AnnotationPresent(Annotation):判断该程序元素上是否包含指定类型的注解,存在则返回true,否则返回false.

方法4:Annotation[] getDeclaredAnnotations():返回直接存在于此元素上的所有注释。与此接口中的其他方法不同,该方法将忽略继承的注释。(如果没有注释直接存在于此元素上,则返回长度为零的一个数组。)该方法的调用者可以随意修改返回的数组;这不会对其他调用者返回的数组产生任何影响。

    public class StudentInfoUtil {

    public static void getStudentInfo(Class clazz) {
        // 获取程序对象所有的Field注释
        Field[] fields = clazz.getDeclaredFields();
        for (Field field : fields) {
            // 判断是否为Student注释
            if (field.isAnnotationPresent(Student.class)) {
                // 获取Annotation对象
                Student student = field.getAnnotation(Student.class);
                System.out.println("姓名" + student.name() + "年龄" + student.age()
                        + "性别" + student.sex());
            }
        }
    }

}

下面写个实例看它怎么用,先写一个student实体bean

public class StudentBean {

    private String name;
    private int age;
    private String sex;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

}

再写个测试

   public class Test {
    @Student(name = "Snail", age = 18, sex = Sex.MAN)
    private StudentBean student01;
    @Student(name = "Snail2", age = 19, sex = Sex.MAN)
    private StudentBean student02;

    public static void main(String[] args) {
        StudentInfoUtil.getStudentInfo(Test.class);
    }

}

输出如下:

姓名Snail年龄18性别MAN
姓名Snail2年龄19性别MAN

可以看到,这里注解可以省去重复声明赋值的麻烦。

参考
深入理解Java:注解(Annotation)自定义注解入门
深入理解Java:注解(Annotation)--注解处理器

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/64177.html

相关文章

  • Java深入-框架技巧

    摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...

    chengtao1633 评论0 收藏0
  • spring boot 初步学习

    摘要:跟两年前写和配置相关的文件相比,这真是十分的简单了。可以试着写一个小小的,有很多视频教程跟着一步步做就成,我是跟着慕课网上的视频学习的。对于写快一年的我来说初学这个还是很欣喜的。 环境配置 Mac 上搭建 java 开发环境http://starzhou.com/blogs/jav... 初始化项目 参考链接http://start.spring.io/ 从此链接中输入项目名,并选择相...

    fancyLuo 评论0 收藏0
  • SSM学习系列(二)Spring对象

    摘要:初步使用注入对象沿用上次的工程新建两个类和修改其中用来标记注入,将注入到中执行结果如下采用注解方式注入对象修改和,加入注解,并赋予默认值为类加上注解,即表明此类是为类加上注解,即表明此类是修改,删除所有子标签,加入自动扫描执行结果 Spring初步使用 注入对象 沿用上次的工程新建两个类Category和Product Category.java public class Catego...

    JerryC 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<