注解与反射

    科技2024-01-23  91

    文章目录

    注解概述基本内置注解注解声明、本质和成员注解属性类型注解属性的使用元注解反射介绍反射的API反射赋值案例代理创建对象的4种方式

    注解概述

    Annotation注解,也叫元数据。作用:编写文档、代码分析、编译检查。现在开发中,用注解替换xml配置文件。格式:“@注释名”,还可以添加一些参数值。通过反射机制编程实现对这些元数据的访问。

    基本内置注解

    @Override:需要重写@Deprecated:不建议使用@SuppresWarnings:有参数,去掉程序中的警告

    注解声明、本质和成员

    声明注解 public @interface MyAnnotation{ }注解的本质就是一个interface。

    注解属性类型

    基本数据类型(四类八种)String类型枚举类型(enmu)注解类型Class类型以上类型的一维数组类型

    注解属性的使用

    如果一个注解有属性,那么在使用注解时,要对属性进行赋值操作。如果一个注解的属性有多个,都需要赋值。可以给属性赋默认值(注解处用default)。如果属性是数组类型:①可以直接使用 属性名={ };②数组值只有一个时可以省略“{}”。对于属性名称value的操作:

    元注解

    用于修饰注解的注解,用于描述注解在什么范围及什么阶段使用。 四个元注解介绍:

    @Retention:指定注解信息在哪个阶段存在。 SOURCE:编译阶段;CLASS:解析执行阶段;RUNTIME:在JVM中。 @Target:标注注解的执行位置(ElementType.XXX)。@Document:生成注解信息到javadoc文档中。@InHerited:让注解有自动继承性。@Retention的值应该是RUNTIME,因为会结合反射技术来使用;@Target一般使用TYPE或METHOD。

    反射介绍

    反射,一种计算机处理方式,对于任一对象,都能动态获取信息以及动态调用对象方法功能。 反射的优缺点:

    优点: 提高了程序的灵活性和扩展性;降低耦合性,提高自适应能力;允许程序创建和控制任何类的对象,无需提前硬编码目标类。 缺点: 性能问题:反射机制应用在对灵活性和拓展性要求很高的系统框架上,普通程序不建议使用。反射会模糊程序内部逻辑,带来维护问题。

    反射的API

    Class介绍及获取 java中的Class可以代表任意的类或者接口类型。 如何获取一个Class? 如果有一个对象,可以直接通过从Object类中继承的getClass方法获取;可以通过类包(接口)直接调用其属性.class获取;(推荐,无耦合)Class.forName()

    为什么要获得Class? 反射操作中会获取类的成员,Constructor、Filed、Method,需要通过Class来获得其他对象。

    Constructor 单个构造器,得到它就可以实例化对象。 getConstructor获取类的public构造;getConstructors获取类的所有public构造;getDeclaredConstructor获取类的private构造;getDeclaredConstructors获取类的所有private构造。 Filed 如何获取Filed? getFiled获取类的public属性;getFileds获取类的所有public属性;getDeclaredFiled获取类的private属性;getDeclaredFileds获取类的所有private属性。 赋值、取值操作 Method 如何获取一个Mehod对象?

    getMethod获取类的方法,包括父类的;

    getMethods获取类的所有方法,包括父类的;

    getDeclaredMethod获取仅本类的方法;

    getDeclaredMethods获取仅本类的所有方法。

    执行方法,invoke

    Method的invoke使用注意事项

    调用static方法

    方法是静态的,invoke调用时不需要传递对象。

    调用参数是数组类型的方法

    反射赋值案例

    代理

    newProxyInstance描述 invocationHandler详解

    是一个接口,接口中声明了一个invoke()(与反射不同)方法,它是在代理对象调用行为时会执行的方法,invoke方法有三个参数:

    动态代理在开发中可以完成性能监控、权限控制、日志记录等操作。

    创建对象的4种方式

    new关键字clone()方法反序列化:objectInputStream.readObject()反射:Class.newInstence()
    Processed: 0.024, SQL: 8