注解初步认识

本文详细介绍了Java注解的使用,包括@Target和@Retention的含义及用法,展示了如何在类、方法等不同位置使用注解,并通过反射机制检查和读取注解信息。同时,讨论了注解参数的定义和使用,以及在反射中获取注解参数的值。

  注解在开发中常被我们利用到反射机制中,辅助反射机制做更多灵活的操作
注解在如今JAVA流行的框架中被大量的应用,简化了以前繁琐的配置工作
注解可以在:
* 类上,属性上,方法上,构造器上,以及参数上使用
* 可以通过java内置的注解@Target来说明当前注解可以被应用的位置,对应的值被定义在ElementType上
* 例如:
* @Target(ElementType.TYPE)  注解只能被用于类上
* @Target({ElementType.TYPE,ElementType.METHOD}) 注解只能被用于类上或方法上
* 当可以用于多个位置时,需要定义成数组的方式包含所有ElementType的值,即"{}"包含
*
*
* @Retention注解,用于标注当前注解的保留级别,有三个选项
* RetentionPolicy.SOURCE 注解仅保留在源代码中
* RetentionPolicy.CLASS 注解保留在字节码中,但是反射机制不能调用
* RetentionPolicy.RUNTIME 注解保留在字节码文件中,并且可以被反射机制所使用
* 当不指定@Retention时,默认的保留级别为CLASS,因此我们通常都需要明确指出保留级别为RUNTIME
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunClass {

}

1.注解可以定义参数

定义参数的格式为:
格式:类型 参数名() [default 默认值]
注:default可选,用于为当前参数定义默认值。如果不指定,则使用注解时必须为此参数赋值。

使用注解传参时格式:
@注解名(参数名1=参数值1[,参数名2=参数值2,....])

如果注解@AutoRunMethod只有一个参数,且参数名为num时,那么使用时格式如下:
@AutoRunMethod(num=1)

=============重点=============
如果注解中只有一个参数,参数名建议选取value,这样的好处是,使用时可以不指定参数名,如:
@AutoRunMethod(1)

如果指定了默认值,则可以不指定参数,例如:
@AutoRunMethod()   此时注解中参数的使用default的默认值
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * 注解可以定义参数
 *
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface AutoRunMethod {
  //为注解定义一个int型的参数
//    int num() default 1;//一个参数时,参数名不建议选取value以外的名字。
    int value() default 1;


}

 

反射机制中查看注解

public class ReflectDemo8 {
    public static void main(String[] args) throws Exception {
//        Class cls = Class.forName("reflect.Person");
        Class cls = Class.forName("reflect.ReflectDemo7");

        //判断当前类对象所表示的类是否被注解@AutoRunClass标注了?
        boolean tf = cls.isAnnotationPresent(AutoRunClass.class);
        if(tf){
            System.out.println(cls.getName()+":被注解@AutoRunClass标注了!");
        }else{
            System.out.println(cls.getName()+":没有被注解@AutoRunClass标注了!");
        }

    }

 

方法上查看注解

public class ReflectDemo9 {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("reflect.Person");
        Method[] methods = cls.getDeclaredMethods();
        for(Method method : methods){
            /*
                除了类对象Class之外,像方法对象Method,属性对象Field等都有
                该方法,用于判断其表示的内容是否被某个注解标注了
             */
            if(method.isAnnotationPresent(AutoRunMethod.class)){
                System.out.println(method.getName()+":被注解@AutoRunMethod标注了");
            }else{
                System.out.println(method.getName()+":没有被注解@AutoRunMethod标注了");
            }
        }


    }
}

 

在反射机制中获取注解的参数

public class ReflectDemo10 {
    public static void main(String[] args) throws Exception {
        Class cls = Class.forName("reflect.Person");
        Method[] methods = cls.getDeclaredMethods();
        for(Method method : methods){
            //判断该方法是否被注解@AutoRunMethod标注了
            if(method.isAnnotationPresent(AutoRunMethod.class)){
                //通过方法对象获取该注解
                AutoRunMethod arm = method.getAnnotation(AutoRunMethod.class);
                int value = arm.value();
                System.out.println(
                        "方法"+method.getName()+
                        "上的注解AutoRunMethod指定的参数值为:"+value
                );
            }


        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Liamlf

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值