A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 蓝色土耳其 初级黑马   /  2019-5-19 10:16  /  532 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 蓝色土耳其 于 2019-5-19 10:31 编辑

注解1.注解概念
  • 注解就是用于说明程序的。参与程序的运行
  • JDK1.5版本之后的新特性

2.注解的作用
  • 编写文档(API帮助文档)
  • 编译检查(@Override   @FunctionalInterface)
  • 代码分析(配合反射使用)【重点

3.常用的注解
  • @Override     用于检测方法是否是重写的
  • @Deprecated    用于标识某个方法是否已过时
  • @SuppressWarnings    用于压制警告
  • @FunctionalInterface    用于检测接口是否是一个函数式接口
  • @Before      在功能方法之前被执行
  • @Test           执行功能方法
  • @After         在功能方法之后被执行

4.自定义注解
  • 格式
  • public @interface 注解名称{

    • 本质

      • 注解本质就是一个接口!所有的注解都实现了Annotation接口

    • 注解中的属性

      • 属性(方法)的返回值数据类型

        • 基本数据类型四类八种
        • String
        • 枚举
        • 注解
        • 以上数据类型的数组

      • 注意事项

        • 可以使用default给属性设置一个默认初始化值
        • 如果属性名叫value,而且只有一个属性时,那么赋值时,属性名可以省略
        • 数组进行赋值时,需要使用{}。如果数组中只有一个值,{}可以省略


    • 元注解

      • @Target(ElementType)

        • TYPE   用于类上面
        • METHOD  用于方法上面
        • FIELD     用于变量上面

      • @Retention(RetentionPolicy)

        • SOURCE   源代码阶段
        • CLASS      字节码阶段
        • RUNTIME  运行时阶段

      • @Documented     可以被抽取到帮助文档中
      • @Inherited            可以被子类继承


    5.解析注解
    • 狗类


    public class Dog {
        public void eat() {
            System.out.println("狗吃肉");
        }
    }
    • 猫类


    public class Cat {
        public void eat() {
            System.out.println("猫吃鱼");
        }
    }
    • 注解


    @Target(value = {ElementType.TYPE,ElementType.FIELD,ElementType.METHOD})
    @Retention(value = RetentionPolicy.RUNTIME)
    @Documented
    @Inherited
    public @interface AnimalAnnotation {
        String className();   // 记录 全类名
        String methodName();  // 记录 方法名
    }
    • 测试类


    @AnimalAnnotation(className = "com.itheima01.Cat",methodName = "eat")
    public class Test06 {
        public static void main(String[] args) throws Exception{
            //获取注解中的属性值
            //1.获取Test06类的Class对象
            Class<Test06> cls = Test06.class;
            //2.通过Class对象来获取注解对象
            AnimalAnnotation animal = cls.getAnnotation(AnimalAnnotation.class);
            //3.通过注解对象调用属性。来获取属性值
            String className = animal.className();
            String methodName = animal.methodName();


            //通过反射来调用方法
            //1.获取Class对象
            Class cls2 = Class.forName(className);
            //2.获取方法
            Method method = cls2.getMethod(methodName);
            //3.执行方法
            method.invoke(cls2.newInstance());
        }
    }


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马