【Java 基础】15 Java 反射机制

反射

为什么使用反射

需求:我公司定义了一组接口,然后第三方公司按照我公司的接口 实现了一套功能,然后交给我们,但是我们公司的项目已经结束,如何实现动态加载第三方公司提供的功能。

什么是反射

反射就是把 Java 类中的各种成分映射成一个个的 Java 对象。例如,一个类有:成员变量,方法,构造方法,包等等信息,利用反射技术可以对一个类进行解剖,把各个组成部分映射成一个个对象。

反射常用类

  • Class 类 - 可获取类和类的成员信息
  • Fileld类 - 可访问类的属性
  • Method类 - 可调用类的方法
  • Constructor类 - 可调用类的构造方法

使用反射的基本步骤

  1. 导入 java.lang.reflect.*;
  2. 获得需要操作的类的 java.lang.Class 对象
  3. 调用 Class 的方法获取 Field、Method 等对象
  4. 使用反射 API 进行操作(设置属性、调用方法)

Class 类

Class 类是反射机制的起源和入口

  • 每个类都有自己的 Class 对象
  • 用于获取与类相关的各种信息
  • 提供了获取类信息的相关信息
  • Class 类继承自 Object 类

Class 类存放的接口信息

  • 类名
  • 父类、接口
  • 方法、构造方法、属性
  • 注释

获取 Class 对象的方法

第一种方式

// 方法 1 :对象.getClass()
Student stu = new Student();
Class clazz = stu.getClass();

第二种方式

// 方法 2 :类.class
clazz = Student.class;
clazz = String.class;

第三种方式

// 方法 3 :Class.forName()
clazz = Class.forName("java.lang.string");
clazz = Class.forName("java.util.Date");

获取类的其他结构信息

Class clazz = Class.forName("java.lang.object");
Field fields[] = clazz.getDeclaredFields(); // 获取 Field 对象
Method methods[] = clazz.getDeclaredMethod(); // 获取 Method 对象
Constructor constructors[] = clazz.getDeclaredConstrutors(); // 获取 Constructor 对象

动态创建对象

方法一 :使用 Class 的 newInstance() 方法,仅适用无参构造方法

Class clazz = Class.forName("com.yyh.pojo.Student");
Object object = clazz.newInstance();

方法二:调用 Constructor 的 newInstance() 方法,适用所有构造方法

Constructor cons = clazz.getConstructor(new Class[]{String.class, Integer.class, Float.class});
Object obj = cons.newInstance(new Object[] {"lkl", 32, 56, 5f});

反射技术的优点和缺点

优点:

  • 提高了 Java 程序的灵活性和扩展性,降低了耦合性,提高自适应能力
  • 允许程序创建和控制任何类的对象,无需提前硬编码目标类

缺点:

  • 性能问题
  • 代码维护问题

猜你喜欢

转载自blog.csdn.net/qq_37581282/article/details/82973149