自定义注解及注解&反射

注解

可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加载,运行时被读取,并执行相应的处理。

自定义注解

在自定义注解类之前要知道注解类的定义方式,需要给注解类进行至少以下两个注解,没错你没听错奶奶滴,就是要给注解进行注解

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)

@Rentention Rentention
@Rentention Rentention用来标记自定义注解的有效范围,他的取值有以下三种:

  • RetentionPolicy.SOURCE: 只在源代码中保留 一般都是用来增加代码的理解性或者帮助代码检查之类的,比如我们的Override;
  • RetentionPolicy.CLASS: 默认的选择,能把注解保留到编译后的字节码class文件中,仅仅到字节码文件中,运行时是无法得到的;
  • RetentionPolicy.RUNTIME: ,注解不仅 能保留到class字节码文件中,还能在运行通过反射获取到,这也是我们最常用的。

@Target
@Target指定Annotation用于修饰哪些程序元素。
@Target也包含一个名为”value“的成员变量,该value成员变量类型为ElementType[ ],ElementType为枚举类型,值有如下几个:

  • ElementType.TYPE:能修饰类、接口或枚举类型
  • ElementType.FIELD:能修饰成员变量
  • ElementType.METHOD:能修饰方法
  • ElementType.PARAMETER:能修饰参数
  • ElementType.CONSTRUCTOR:能修饰构造器
  • ElementType.LOCAL_VARIABLE:能修饰局部变量
  • ElementType.ANNOTATION_TYPE:能修饰注解
  • ElementType.PACKAGE:能修饰包

以下为注解类写法

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

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface BindString {
    String value() default "";
}

被注解的类

public class AnnotationEntity {

    @BindString("哈哈")
    private String test;

    public void printInfo(){
        System.out.println(test);
    }
}

反射获取注解并赋值给参数

		Class clzz = Class.forName("com.test.application.javatest.AnnotationEntity");

        //拿到构造方法
        Constructor constructor = clzz.getConstructor();

        //获取对象
        AnnotationEntity entity = (AnnotationEntity) constructor.newInstance();

        //获取注解类

        //将注解内容设置给参数
        Field field = clzz.getDeclaredField("test");
        field.setAccessible(true);

        BindString testAnnotation = (BindString) field.getAnnotation(BindString.class);

        field.set(entity,testAnnotation.value());

        //调用
        entity.printInfo();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值