📜  Java中的反射(1)

📅  最后修改于: 2023-12-03 15:31:58.255000             🧑  作者: Mango

Java中的反射

简介

Java中的反射机制指的是程序在运行中可以动态地获取一个类的信息以及调用它的方法。通过反射机制,可以向程序中加入一些动态性和灵活性,但同时也增加了程序的复杂度和不安全性。

反射的作用
  1. 在运行时判断任意一个对象所属的类;
  2. 在运行时构造任意一个类的对象;
  3. 在运行时判断任意一个类所具有的成员变量和方法;
  4. 在运行时调用任意一个对象的方法;
反射的使用
获取类加载器

获取类加载器,可以使用getClassLoader()方法,也可以使用Thread.currentThread().getContextClassLoader()方法。

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
获取类信息

获取类信息,可以通过java.lang.Class类的forName()方法获取,也可以通过对象的getClass()方法获取。获取到类信息之后,就可以获取该类的各种信息了。

// 通过类名获取类信息
Class<?> clazz = Class.forName("com.example.demo.Test");

// 通过对象获取类信息
Test test = new Test();
Class<?> clazz = test.getClass();
获取类的构造器

获取类的构造器,可以使用getConstructor()方法或者getDeclaredConstructor()方法,前者只能获取public修饰的构造器,后者可以获取所有的构造器,包括private修饰的。

// 获取public修饰的构造器
Constructor<?> constructor = clazz.getConstructor(String.class, int.class);

// 获取所有的构造器
Constructor<?> constructor = clazz.getDeclaredConstructor(String.class, int.class);
获取类的成员变量

获取类的成员变量,可以使用getField()方法或者getDeclaredField()方法,前者只能获取public修饰的成员变量,后者可以获取所有的成员变量,包括private修饰的。

// 获取public修饰的成员变量
Field field = clazz.getField("name");

// 获取所有的成员变量
Field field = clazz.getDeclaredField("name");
获取类的方法

获取类的方法,可以使用getMethod()方法或者getDeclaredMethod()方法,前者只能获取public修饰的方法,后者可以获取所有的方法,包括private修饰的。

// 获取public修饰的方法
Method method = clazz.getMethod("getName");

// 获取所有的方法
Method method = clazz.getDeclaredMethod("getName");
调用类的方法

调用类的方法,可以使用invoke()方法。

method.invoke(test);
反射的优缺点
优点
  1. 可以动态地获取类的信息和调用它的方法;
  2. 可以向程序中加入一些动态性和灵活性。
缺点
  1. 反射的使用会增加程序的复杂度;
  2. 反射的使用会增加程序的不安全性;
  3. 反射的使用会影响程序的性能。