反射——注解

注解
* 注解被大量应用与反射中,可以辅助反射机制做更多灵活的操作。
* 后期使用的框架基本都是使用注解进行配置的。
*
* 在注解上我们有两个常用的注解用来说明当前注解的相关特性:
* @Target:用于说明我们定义的注解可以被应用到哪里。
*         该注解可以传递的参数为ElementType类型,用来表示可标注的位置。
*         常见的有:
*         ElementType.TYPE:在类上用
*         ElementType.METHOD:在方法上
*         ElementType.FIELD:在属性上用
*         ...
*         如果不指定@Target,则当前注解可以被应用在任何注解可使用的位置上。
*
* @Retention:当前注解的保留级别,有三个可选值
*          RetentionPolicy.SOURCE:当前注解仅保留在源代码中,编译后的字节码文件中没有该注解
*          RetentionPolicy.CLASS:保留到编译后的字节码文件中,但是反射机制不可访问
*          RetentionPolicy.RUNTIME:保留到字节码中且反射机制可以访问
*          不指定时,默认保留级别为CLASS

/*
    注解中定义参数的语法:
    类型 参数名() [default 默认值];   注:[]中的内容可写,可不写。

    如果当前注解只有一个参数时,那么参数名应当叫value.
    此时当我们在外面使用该注解时,可以使用:
    @AutoRunMethod(3)
    进行传参。此时注解中value的值为3

    如果该参数名不叫value,例如,定义时如下:
    public @interface AutoRunMethod{
        int num();
    }
    此时当我们在外面使用该注解时,可以使用:
    @AutoRunMethod(num=3)       语法要求:传参时格式为:参数名=参数值
    进行传参。此时注解中num的值为3
    只有参数名叫value时,传递参数才可以将参数名忽略。

    以上特性仅限于只有一个参数时。

    当有多个参数时,例如,定义时如下:
    public @interface AutoRunMethod{
        int value();
        String name();
    }
    使用注解传递参数时,参数名都不可以忽略,必须写为name=value的格式,且顺序无所谓。
    例如:
    @AutoRunMethod(value=1,name="张三")
    @AutoRunMethod(name="张三",value=1)
    以上都正确


    参数可以使用default指定默认值,那么在使用注解时。可以不指定该参数的值,此时使用默认值
     public @interface AutoRunMethod{
        int value() default 1;
     }
     使用该注解时:
     @AutoRunMethod(3)
     此时value的值为3

     @AutoRunMethod
     此时value的值为1(默认值)


 */
//为注解定义一个int型的参数value
/**
 * 反射机制访问注解
 */

public class ReflectDemo7 {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("reflect.Person");
        /*
            Class,Method等常用的反射对象都提供了一个方法:
            boolean isAnnotationPresent(Class cls)
            用于判断是否被参数指定的注解标注过(参数为注解的类对象)
         */
        //cls所表示的类Person是否被注解@AutoRunClass标注过
        boolean flag = cls.isAnnotationPresent(AutoRunClass.class);
        if(flag){
            System.out.println("被标注了!");
        }else{
            System.out.println("没有被标注!");
        }

    }
}



/**
 * 获取注解中的参数
 */
public class ReflectDemo8 {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("reflect.Person");
        Method method = cls.getMethod("sayHello");
        if(method.isAnnotationPresent(AutoRunMethod.class)){
            //获取该方法上的注解@AutoRunMethod
            AutoRunMethod arm = method.getAnnotation(AutoRunMethod.class);
            //通过注解对象获取value参数的值
            int value = arm.value();
            System.out.println(value);
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值