JAVA自定义注解详情

目录
  • 原理:
  • 元注解:
    • @Retention参数讲解:
  • 案例:
    • 给一个类的String属性设置默认值
  • 总结

原理:

注解的本质是继承Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类.而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象Proxy1,通过动态代理对象,调用自定义注解(接口)的方法,最终会调用AnnotationInvocationHandler 的invoke方法.

元注解:

  • @Documented:是否将注解包含到JavaDoc中
  • @Retention:什么时候使用该注解,表明注解的生命周期
  • @Target:注解用于什么地方
  • @Inherited:是否允许子类继承改注解

@Retention参数讲解:

RetentionPolicy.SOURCE:在编译阶段丢弃,这些注解在编译结束后就不会再有意义,所以它不会写入字节码.比如@Override, @SuppressWarnings都属于这类注解。

RetentionPolicy.CLASS:在类加载的时候丢弃, 包含在类文件中

RetentionPolicy.RUNTIME:包含在类文件中,在运行时可以被获取到

@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版本新增,应用于任何使用类型的语句中

案例:

给一个类的String属性设置默认值

@Documented
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface ObjectFlag {
    //默认值
    String value() default "默认值1";
}
public class ObjectTest {
    @ObjectFlag
    String name;
    @ObjectFlag
    Integer age;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }
public class ObjectRun {
  public static <T> T setValueField(T t) throws IllegalAccessException {
        Class<?> cls = t.getClass();
        Field[] fields = cls.getDeclaredFields();
        for (Field field : fields) {
            boolean hasConfigField = field.isAnnotationPresent(ObjectFlag.class);
            field.setAccessible(true);//设置可以访问私有变量
            //若属性上有注解,使用注解的值作为key去配置文件中查找
            if (hasConfigField) {
                //获取注解的默认值
                Object annoValue = field.getAnnotation(ObjectFlag.class).value();
                System.out.println("当前的属性名称为:" + field.getName());
                System.out.println("当前属性类型:" + field.getGenericType().toString());
                //获取到属性的数据类型
                String type = field.getGenericType().toString();
                if (type.endsWith("String")) {//如果是字符串类型
                    field.set(t, annoValue.toString());
                }
            } else {  //若属性上没有注解,则使用属性名作为key去配置文件中查找
                System.out.println("属性" + field.getGenericType().toString() + "没有该注解");
            }
        }
        return t;
    }
}

运行结果:

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之际的更多内容!

(0)

相关推荐

  • Java 自定义注解的魅力

    注解是什么? ①.引用自维基百科的内容: Java注解又称Java标注,是JDK5.0版本开始支持加入源代码的特殊语法 元数据 . Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反射获取标注内容.在编译器生成类文件时,标注可以被嵌入到字节码中.Java虚拟机可以保留标注内容,在运行时可以获取到标注内容. 当然它也支持自定义Java标注. ②.引用自网络的内容: Java 注解是在 JDK5 时引入的新特性,注解(也被称为 元数据 )为我们在代码

  • Java中自定义注解类及使用实例解析

    这篇文章主要介绍了Java中自定义注解类并使用过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 在Java框架中,经常会使用注解,而且还可以省很多事,来了解下自定义注解. 注解是一种能被添加到java代码中的元数据,类.方法.变量.参数和包都可以用注解来修饰.注解对于它所修饰的代码并没有直接的影响 先写一个自己的注解类 @Documented //会被javadoc命令识别 @Retention(RetentionPolicy.RUNTI

  • Java使用poi做加自定义注解实现对象与Excel相互转换

    引入依赖 maven <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> Gradle implementation group: 'org.apache.poi', name: 'poi', version: '3.17' 代码展示 1

  • 谈谈Java中自定义注解及使用场景

    Java自定义注解一般使用场景为:自定义注解+拦截器或者AOP,使用自定义注解来自己设计框架,使得代码看起来非常优雅.本文将先从自定义注解的基础概念说起,然后开始实战,写小段代码实现自定义注解+拦截器,自定义注解+AOP. 一. 什么是注解(Annotation) Java注解是什么,以下是引用自维基百科的内容 Java注解又称Java标注,是JDK5.0版本开始支持加入源代码的特殊语法元数据. Java语言中的类.方法.变量.参数和包等都可以被标注.和Javadoc不同,Java标注可以通过反

  • Spring的@Validation和javax包下的@Valid区别以及自定义校验注解

    1.后台参数校验 Spring Validation验证框架对参数的验证机制提供了@Validated(Spring JSR-303规范,是标准JSR-303的一个变种),javax提供了@Valid(标准JSR-303规范),配合BindingResult可以直接提供参数验证结果 spring提供的验证:org.springframework.validation.annotation.Validated; javax提供的验证:javax.validation.Valid; 在检验Contr

  • Java使用自定义注解实现为事件源绑定事件监听器操作示例

    本文实例讲述了Java使用自定义注解实现为事件源绑定事件监听器操作.分享给大家供大家参考,具体如下: 一 定义注解 import java.lang.annotation.*; import java.awt.event.*; @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface ActionListenerFor { // 定义一个成员变量,用于设置元数据 // 该listener成员变

  • JAVA自定义注解详情

    目录 原理: 元注解: @Retention参数讲解: 案例: 给一个类的String属性设置默认值 总结 原理: 注解的本质是继承Annotation的特殊接口,其具体实现类是Java运行时生成的动态代理类.而我们通过反射获取注解时,返回的是Java运行时生成的动态代理对象Proxy1,通过动态代理对象,调用自定义注解(接口)的方法,最终会调用AnnotationInvocationHandler 的invoke方法. 元注解: @Documented:是否将注解包含到JavaDoc中 @Re

  • java自定义注解实现前后台参数校验的实例

    其实是可以通过@Constraint来限定自定义注解的方法. @Constraint(validatedBy = xxxx.class) 下面是我做的 java自定义注解实现前后台参数校验 的代码示例 对这个感兴趣的,请好好看,好好学: package sonn.sonnannotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.anno

  • 浅谈Java自定义注解和运行时靠反射获取注解

    java自定义注解 Java注解是附加在代码中的一些元信息,用于一些工具在编译.运行时进行解析和使用,起到说明.配置的功能. 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用.包含在 java.lang.annotation 包中. 1.元注解 元注解是指注解的注解.包括  @Retention @Target @Document @Inherited四种. 1.1.@Retention: 定义注解的保留策略 @Retention(RetentionPolicy.SOURCE) //注解仅

  • java 自定义注解的实例详解

    java  自定义注解的实例详解 Java的Annotation是在5.0版本之后引入的,可以用于创建文档,跟踪代码中的依赖性,并且可以执行编译时期检查.注解就是给虚拟机看的,代表程序的一些特殊的功能.JDK中提供了@Override,@SuppressWarning,@Deprecated三种注解,当让还有元注解,@Target,@Retention,@Documented,@Inherited,元注解的作用负责注解其它注解. 要想了解注解,就要了解自定义注解,了解是通过反射来实现的. 首先,

  • Java 自定义注解及利用反射读取注解的实例

    一.自定义注解 元注解: @interface注解: 定义注解接口 @Target注解: 用于约束被描述的注解的使用范围,当被描述的注解超出使用范围则编译失败.如:ElementType.METHOD,ElementType.TYPE: @Retention 注解:用于约束被定义注解的作用范围,作用范围有三个: 1.RetentionPolicy.SOURCE:作用范围是源码,作用于Java文件中,当执行javac时去除该注解. 2.RetentionPolicy.CLASS:作用范围是二进制码

  • Java自定义注解的详解

    Java自定义注解 Java注解提供了关于代码的一些信息,但并不直接作用于它所注解的代码内容.在这个教程当中,我们将学习Java的注解,如何定制注解,注解的使用以及如何通过反射解析注解. Java1.5引入了注解,当前许多java框架中大量使用注解,如hibernate.Jersey.spring.注解作为程序的元数据嵌入到程序当中.注解可以被一些解析工具或者是编译工具进行解析.我们也可以声明注解在编译过程或执行时产生作用. 在使用注解之前,程序源数据只是通过java注释和javadoc,但是注

  • 简单谈谈java自定义注解

    Java在1.5开始引入了注解,目前流行的框架都在用注解,可想而知注解的强大之处. 以下通过自定义注解来深入了解java注解. 一.创建自定义注解 package com.sam.annotation; import java.lang.annotation.*; /** * @author sam * @since 2017/7/13 */ @Target({ElementType.METHOD, ElementType.FIELD}) @Retention(RetentionPolicy.R

  • Java自定义注解用法实例小结

    本文实例讲述了Java自定义注解用法.分享给大家供大家参考,具体如下: 一 自定义注解语法 [public] @interface Annotation的名称 { [数据类型 变量名称();] } 要自定义注解,需要使用@interface方式进行定义,在定义注解时也可以定义各种变量,但是变量之后必须使用括号(). 提示:使用@interface就相对于继承了Annotation接口.在程序中使用@interface声明Annotation,那么此Annotation实际相对于继承了Annota

  • java自定义注解验证手机格式的实现示例

    1.@Valid与@Validated的区别 1.1 基本区别 @Valid:Hibernate validation校验机制 @Validated:Spring Validator校验机制,这个也是最常用的 @Validation只是对@Valid进行了二次封装,在使用上并没有太大区别,但在分组.注解位置.嵌套验证等功能上有所不同 1.2 作用范围 @Validated:用在类型.方法和方法参数上.但不能用于成员属性(field) @Valid:可以用在方法.构造函数.方法参数和成员属性(fi

随机推荐