注解学习

       注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明在包、类、字段、方法、局部变量、方法参数等的前面,用来对这些元素进行说明,注释。

       使用注解:@注解名称

       作用分类:

               编写文档:通过代码里表示的元数据生成文档【生成doc文档】

               代码分析:通过代码里标识的元数据对diamagnetic进行分析【使用反射】

               编译检查:通过代码里标识的元数据让编译器能够实现基本的编译检查【Override】

       JDK一些预定义注解

       @Override

       检测被该注解标注的方法是否是继承父类(接口)的

       @Deprecated

       该注解标注的内容表示已过时

       @SuppressWarnings    

       压制警告(@SuppressWarnings("all")压制所有警告)

       自定义注解

        格式:

               元注解

               public @注解名称{

                属性列表

                }

       本质:注解本质是一个继承java.lang.annotation.Annotation接口的接口

       public interface MyAnno extends java.lang.annotation.Annotation{}

       属性:接口中的抽象方法

                  方法返回值数据类型有要求

                         基本数据类型

                         String

                         枚举

                         注解

                         以上类型的数组

                 定义了属性,使用时需要给属性赋值

                        如果定义属性时,使用default关键字给属性默认初始化值,则使用注解时,可以不进行属性的赋值。

                        如果只有一个属性需要复名称制,并且属性名称是value,则value可以省略,直接定义值。

                        数组赋值时,使用{}包裹,如果数组中只有一个值,则{}可以省略。

       元注解:用于描述注解的注解

              @Target:描述注解作用的位置

                                ElementType取值:

                                       TYPE:作用在类上

                                       METHOD:作用在方法上

                                       FIELD:作用于成员变量上

              @Retention:描述注解保留的阶段

                                  @Retention(RetentionPolicy.RUNTIME):当前被描述的注解,会保存到class字节码文件中,并被JVM读取                                                                                                  到 

              @Documented:描述注解是否被抽取到api文档中

              @Inherited:描述注解是否被字类继承

       解析注解:获取注解中定义的属性值

       案例:利用注解为反射注入类全路径名和方法名

      创建Demo1、Demo2两个测试类

public class Demo1 {
    public void show(){
        System.out.println("Demo1 show");
    }
}
public class Demo2 {
    public void show(){
        System.out.println("Demo2 show");
    }
}

       创建注解Pro

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

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Pro {
    String className();
    String methodName();
}

       编写测试类

import java.lang.reflect.Method;

@Pro(className = "cn.zjut.annotation.Demo2", methodName = "show")
public class ReflectTest {
    public static void main(String[] args) throws Exception {
        //解析注解
        //获取本类字节码对象
        Class<ReflectTest> reflectTestClass  = ReflectTest.class;
        //利用本类字节码对象的getAnnotation()获取注解对象
        Pro pro = reflectTestClass.getAnnotation(Pro.class);
        //获取注解的属性值
        String className = pro.className();
        String mehtodName = pro.methodName();

        System.out.println(className);
        System.out.println(mehtodName);

        Class cls = Class.forName(className);
        Object obj = cls.newInstance();
        Method method = cls.getMethod(mehtodName);
        method.invoke(obj);
    }
}

       解析注解步骤总结:获取注解定义位置的对象(Class、Method、Field)、获取指定的注解对象(getAnnotation(Class clazz))、调用注解中的抽象方法获取配置的属性值

 

 

     

 

 

 

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值