Java注解——反射机制访问注解

一、注解的定义:
        Java注解又称Java标注,是在 JDK5 时引入的新特性。注解可以在程序执行时可以被程序读取。

public @interface AutoRunClass{

}

二、注解的应用
        注解被大量应用与反射中,可以辅助反射机制做更多灵活的操作。后期使用的框架基本都是使用注解进行配置的。

注解中有两个常用的注解可以说明当前注解的相关特性:
   <1 @Target:用于说明我们定义的注解可以被应用到哪里。
        该注解可以传递的参数为ElementType类型,用来表示可标注的位置。
        常见的有:
        ElementType.TYPE:在类上用
        ElementType.METHOD:在方法上
        ElementType.FIELD:在属性上用
         ...
        如果不指定@Target,则当前注解可以被应用在任何注解可使用的位置上。

<2 @Retention:当前注解的保留级别,有三个可选值
          RetentionPolicy.SOURCE:当前注解仅保留在源代码中,编译后的字节码文件中没有该注解
          RetentionPolicy.CLASS:保留到编译后的字节码文件中,但是反射机制不可访问
          RetentionPolicy.RUNTIME:保留到字节码中且反射机制可以访问
         不指定时,默认保留级别为CLASS

 三、注解中定义参数

/*
注解中定义参数的语法:
类型 参数名() [default 默认值];   []中的内容可写,可不写
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunClass{

}
------------------------------------------------------------
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunMethod{
 //如果当前注解只有一个参数,那么参数名应当叫value
 //可以在注解中定义多个参数,在传参时,参数名不能忽略,传参顺序没有要求
    int value() default 1;    
    String name();        
}

@AutoRunClass
public class Student{
    private String name="张三";
    private int age=18;
    public Student(){}
    
    public Student(String name,int age){
        this.name = name;
        this.age = age;
    }
    
    @AutoRunMethod(value=2,name="张三")  //@AutoRunMethod注解中的value会返回2
    public void sayHello(){
        System.out.priintln(name+"hello");
    }
    @AutoRunMethod(name = "李四")   //value的默认值为1
    public void sayHi(){
        System.out.println(name+":hi!");
    }
}

四、在类中加入反射机制实现注解

public class ReflectDemo{
    public static void main(String[] args) throws Exception{
    Class cls = Class.forName("reflect.Student");
    Method method = cls.getDeclaredMethod("sayHello");
    //判断cls所表示的Student是否被注解@AutoRunClass标注  
    if(cls.isAnnotationPresent(AutoRunClass.class)){
        
    //判断cls所表示的Student是否被注解@AutoRunMethod标注
    if(method.isAnnotationPresent(AutoRunMethod.class)){
        //获取该方法上的注解@AutoRunMethod
         AutoRunMethod arm = method.getAnnotation(AutoRunnMethod.class);
        
        //通过注解对象获取value参数的值
         int value = arm.value();
        }
      }
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值