反射的学习笔记

小咪咪 2022-04-23 22:44 241阅读 0赞

反射的概述

什么是反射

反射机制是在运行状态中,对于任意一个类可以获取这个类的属性和方法,对于任何一个对象能调用它任意属性和方法!这种动态获取信息和动态调用对方方法的功能机制就叫做java语言反射机制

反射的作用

  • 用来编写通用性较高的代码或者框架的时候调用

反射机制的实现

  • Class类与java.lang.reflect类库一起实现<反射>机制
    java.lang.reflect类库包含Field/Method/Constructors类。这些类型的对象由JVM在运行时出创建,分别用于获取未知类的域/方法/构造器:

  • 通过Class类和java.lang.reflect类包,未知对象的类信息在运行时被确定,并且在编译时无需获取;

获取放射的三种方式

  1. Class.fromname("包名+类名")
  2. Class cla=类名.class
  3. Class aclass=对象.getClass()

反射的常用方法

普通反射

  • 获取反射对象Class<?> aClass = Class.forName("/Users/gycmacbook/Downloads/Day01/Day13/src/Test.java ");
  • 获取对象的构照

    • Constructor<?> constructor=aClass.getConstructor("",...); 获取指定构造
    • Constructor<?> constructor[]=aClass.getConstructors("",...); 获取所有的构造
  • 获取元素的属性

    • Field field = aClass.getField("name"); 获取指定的公开属性
    • Field[] field = aClass.getFields("");获取所有公开属性
  • 获取方法

    • Method a = aClass.getMethod("a", int.class); 获取指定的方法 a:方法名 int.class 参数类型
    • Method[] methods = aClass.getMethods(); 获取所有的方法
    • Object o = aClass.newInstance(); a.invoke(o, 3); 获取该类对象调用类中方法

暴力反射

  • 获取反射对象:Class<Test> testClass = Test.class;
  • 获取对象的构照

    • Constructor<?> constructor=aClass.getConstructor("",...); 获取指定构造
    • Constructor<?> constructor[]=aClass.getConstructors("",...); 获取所有的构造
  • 获取对象的方法

    • Method a =testClass.getDeclaredMethod("a", int.class); 获取对象指定的方法 包括私有方法 a 方法名int 方法类型
    • Method[] declaredMethods = testClass.getDeclaredMethods();` 获取对象的方法 包括私有方法
  • 获取对象的属性

    • Field declaredField = testClass.getDeclaredField("b"); 获取指定的属性名 包括private修饰的
    • Field[] declaredFields = testClass.getDeclaredFields(); 获取所有的的属性名 包括private

      注解

概述:

Annotation注解,是一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口是在同一个层次

注解的作用

  1. 编译检查:通过代码里标识注解,让编译器能够实现基本的编译检查。例如 :@Override
  2. 代码分析:通过代码里标识注解,对代码进行分析。 例如 : @Test
  3. 配置文件:可以部分替代配置文件
  4. Properties
  5. 文件(项目需要配置信息) party.propeties
  6. 需要解析 : 将配置文件中的信息读取出来 new Properties();
  7. Annotation
  8. 注解(赋值): 设置了一些配置信息 (代码)
  9. 反射 : 注解的解析
  10. JDK提供的注解
  11. @Override 重写
  12. 被 override 注解修饰的方法必须是父类中重写方法或接口中的抽象方法
  13. @FunctionalInterface(JDK8) : 检测是否是函数式接口
  14. 被FunctionalInterface修饰的接口必须是函数式接口,才能通过编译
  15. SuppressWarnings 抑制警告
  16. 让编译器不要报出警告信息

自定义注解

  1. 定义注解名

    1. 使用 @interface 关键字定义注解类.
    2. 编写注解的名称, 名称以大写开头
    3. 定义注解属性
    4. 注解类只有属性,没有任何方法.
    5. 属性的格式为: 元素类型 属性名(); 格式类似于接口的抽象方法.
    6. 注解中只能定义 基本数据类型, 字符串类型, 类类型, 注解类型, 枚举类型 共12中类型数据.
    7. 如果需要给注解属性定义默认值, 请使用 default 关键字
    8. 如果注解中只有一个属性, 那么请将该属性定义为 value 名称. 好处: 使用该注解时可以省略 value=
    9. 元注解 : 注解的注解, 主要作用就是用来修饰自定义注解.
    10. @Target: 指明自定义注解可以使用的 位置
    11. Type 类型
    12. Method 方法
    13. Field 属性
    14. Retention:指定该注解的 保留策略
    15. source:源码
    16. class:编译
    17. runtime:运行时(反射读取都在阶段)
    18. 注解的使用
    19. 在类、方法、属性等相应位置使用注解
    20. 语法:@注解(属性1 = value,属性2 = value…)
    21. 自定义注解,一般在JVM运行时生效
  2. 注解的解析
  3. 注解需要反射机制获取!
  4. 接口 AnnotatedElement:表示目前正在此 VM 中运行的程序的一个已注释元素。该接口允许反射性地读取注释
  5. 实现类: Class, Constructor, Field, Method, Package ,AccessibleObject
  6. 方法
  7. getAnnotation(Class annotationClass)

    1. 如果存在该元素的指定类型的注释,则返回这些注释,否则返回 null。
  8. Annotation[] getAnnotations()

    1. 返回此元素上存在的所有注释。
  9. Annotation[] getDeclaredAnnotations()

    1. 返回直接存在于此元素上的所有注释。
    2. boolean isAnnotationPresent(Class<? extends Annotation> annotationClass):如果指定类型的注释存在于此元素上,则返回 true,否则返回 false。

发表评论

表情:
评论列表 (有 0 条评论,241人围观)

还没有评论,来说两句吧...

相关阅读

    相关 学习笔记

    反射的概述 – 什么是反射 > 反射机制是在运行状态中,对于任意一个类可以获取这个类的属性和方法,对于任何一个对象能调用它任意属性和方法!这种动态获取信息和动态调

    相关 使用

    概述     JAVA反射机制是在运行中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态

    相关 Java深入浅出

    刚开始接触反射这个概念,感觉反射这个机制很复杂很难懂,所以在这篇文章中对java的反射机制以个人的理解总结归纳。 1. 什么是反射? 什么是反射?在官方文档中是这样说的