请选择 进入手机版 | 继续访问电脑版

热点推荐

查看: 95|回复: 0

注解原理及使用

[复制链接]

该用户从未签到

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 5 天前 | 显示全部楼层 |阅读模式
前言


  • Java 注解(Annotation)又称 Java 标注,是 JDK5.0 引入的一种注释机制。
  • Java 语言中的类、方法、变量、参数和包等都可以被标注。
概述

内置的注解

Java 定义了一套注解,共有 7 个,3 个在 java.lang 中,剩下 4 个在 java.lang.annotation 中。
java.lang内置的3个注解(作用在代码的注解):
@Override:检查该方法是否是重载方法。如果父类,或引用的接口中并没有该方法时会报错
@Deprecated:标记过时方法。如果使用该方法,会报编译警告
@SuppressWarnings:指示编译器去忽略注解中声明的警告
java.lang.annotation内置的4个注解(作用在其他注解的注解):
@Retention:标识这个注解的保留期范围,是只在源码中,还是编入class文件中,或者是在运行时可以通过反射访问(值类型为RetentionPolicy)
@Target:标记这个注解应该是哪种 Java 成员(值类型为ElementType)
@Documented:标记这些注解是否包含在用户文档中
@Inherited:标注这个注解是否可以被继承,即一个超类被 @Inherited 注解过的注解进行注解的话,那么如果它的子类没有被任何注解应用的话,那么这个子类就继承了超类的注解
@Retention(RetentionPolicy)

取值意义RetentionPolicy.SOURCE注解只在源码阶段保留,在编译器进行编译时它将被丢弃忽视RetentionPolicy.CLASS注解只被保留到编译进行的时候,它并不会被加载到 JVM 中RetentionPolicy.SOURCE注解可以保留到程序运行的时候,它会被加载进入到 JVM 中,所以在程序运行时可以获取到它们@Target(ElementType)

取值意义ElementType.PARAMETER可以给一个方法内的参数进行注解ElementType.FIELD可以给属性进行注解ElementType.METHOD可以给方法进行注解ElementType.CONSTRUCTOR可以给构造方法进行注解ElementType.TYPE可以给一个类型进行注解,比如类、接口、枚举ElementType.PACKAGE可以给一个包进行注解自定义注解实例


  • 定义一个校验属性长度的注解
@Retention(RetentionPolicy.RUNTIME)@Target(ElementType.FIELD)@Documented@Inheritedpublic @interface InputAnnotation {    /**     * 输入字符串的最大长度     */    int max() default 1000;    /**     * 输入字符串的最小长度     */    int min() default 0;    /**     * 输入字符串字段描述     */    String desc() default "";}

  • 编写自定义注解解析方法
public class ParseAnnotationUtils {    /**     * input注解解析函数     *     * @param object 对象     * @return 解析结果     */    public static String parseInput(Object object) throws IllegalAccessException {        // 通过反射获取对象的所有属性        Class clz = object.getClass();        Field[] fields = clz.getDeclaredFields();        StringBuilder result = new StringBuilder();        for (Field field : fields) {            // 获取Field属性的InputAnnotation注解            field.setAccessible(true);            InputAnnotation annotation = field.getAnnotation(InputAnnotation.class);            if (annotation == null) {                continue;            }            // 校验注解的max属性            if (field.get(object).toString().length() > annotation.max()) {                return "属性" + field.getName() + "的长度大于" + annotation.max();            }            // 校验注解的min属性            if (field.get(object).toString().length() < annotation.min()) {                return "属性" + field.getName() + "的长度低于" + annotation.min();            }            result.append("【属性-" + field.getName() + " 描述-" + annotation.desc() + " 验证通过】");        }        return result.toString();    }}

  • 使用注解
@Datapublic class Member {    @InputAnnotation(max = 10, min = 5, desc = "会员名")    private String name;    @InputAnnotation(max = 10, min = 5, desc = "密码")    private String password;}

  • 调用注解解析方法
public static void main(String[] args) throws Exception {    Member member = new Member();    member.setName("member");    member.setPassword("123456");    String result = ParseAnnotationUtils.parseInput(member);    System.out.println(result);}
Java吧 收集整理 java8论坛 www.java8.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表