注解深入浅出(四反射)

Posted 持续学习刻意练习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了注解深入浅出(四反射)相关的知识,希望对你有一定的参考价值。

第二章注解深入浅出

四、反射

4.1 什么是发射机制

Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为 Java 语言的反射机制。 注意关键词:运行状态,换句话说,Java 程序可以加载一个运行时才得知名称的 class,获悉其完整构造(但不包括 methods 定义),并生成其对象实体、或对其 fields 设值、或唤起其 methods。

反射:是一种机制,利用该机制可以在程序运行过程中对类进行解剖并操作类中的方法、属性、构造方法等成员。是另外一种调用构造方法、普通方法、属性的方式。

对比普通方法,发射功能更强,但是更麻烦,反射操作的统一步骤,获取 Class 字节码对象,
要操作什么就获取什么(getxxx(),getDeclaredXXX()),
要操作构造方法,就获取 Constructor 对象;
要操作普通方法,就获取 Method 对象;
要操作属性字段,就获取 Field 对象;
如果操作的类型是 private,就提前设置允许暴力反射:setAccessible(true)

4.2 反射机制主要提供的功能

  • 在运行时判断任意一个对象所属的类
  • 在运行时构造任意一个类的对象
  • 在运行时判断任意一个类所具有的成员变量和方法
  • 在运行时调用任意一个对象的方法

4.3 Java Reflection API 简介

  1. Class 类:代表一个类【java.lang.Class】
  2. Field 类:代表类的成员变量(成员变量也称为类的属性)【java.lang.reflect.Field】
  3. Method 类:代表类的方法【java.lang.reflect.Method】
  4. Constructor 类:代表类的构造方法【java.lang.reflect.Constructor】
  5. Array 类:提供了动态创建数组,以及访问数组的元素的静态方法
  6. Modifier 类:【java.lang.reflect.Modifier】

4.4 反射获取 Class 类

Class 类没有共有的构造方法,被 jvm 调用的(简单理解:new 对象或者被类加载器加载的时候),在 Java 中,每个 class 都有一个相应的 Class 对象,也就是说,当我们编写一个类,编译完成后,在生成的 .class 文件中,就会产生一个 Class 对象,用于表示这个类的类型信息。

获取 Class 的三种方式:

  1. 利用对象调用 getClass() 方法获取该对象的 Class 实例
Person person = new Person();
Class<? extend Person> personClass01 = person.getClass();
  1. 使用 Class 类的静态方法 forName(),用类的名字获取一个 Class 实例
try 
    Class<?> personClass02 = Class.forName("Person");
 catch (ClassNotFoundException e) 
    e.printStackTrace();

  1. 运用 .class 的方式来获取 Class 实例,对于基本数据类型的封装类,还可以采用 .TYPE 来获取相对应的基本数据类型的 Class 实例
Class<? extends Person> personClass03 = Person.class;

说明:在运行期间,如果我们要产生某个类的对象,Java 虚拟机(JVM)会检查该类型的 Class 对象是否已被加载。如果没有被加载,JVM 会根据类的名称找到 .class 文件并加载它。一旦某个类型的 Class 对象已被加载到内存,就可以用它来产生该类型的所有对象。

4.5 反射调用

发射调用 Constructor:newInstance();
反射调用 Method:invoke();
反射调用 Field:set(),get()

方法关键字含义
getDeclaredMethods()获取所有方法
getReturnType()获取方法的返回类型
getParameterTypes()获取方法的传入参数类型
getDeclaredMethod(“方法名”, 参数类型.class, ……)获取特定的方法
构造方法关键字含义
getDeclaredConstructors()获取所有的构造方法
getDeclaredConstructor(参数类型.class, ……)获取特定的构造方法
父类和父接口含义
getSuperclass()获取某类的父类
getInterfaces()获取某类实现的接口

以上是关于注解深入浅出(四反射)的主要内容,如果未能解决你的问题,请参考以下文章

注解和反射反射获取泛型反射获取注解

理解Android中的注解与反射

Java基础——注解和反射

Java反射学习总结五(Annotation(注解)-基础篇)

Java反射学习总结五(Annotation(注解)-基础篇)

Java反射与自定义注解