JAVA中的反射机制

102 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第12天,点击查看活动详情

JAVA中的反射机制

前言

今天我们来聊一聊JAVA中的反射机制,反射在JAVA编程中很多地方都会遇到,例如逆向代码、设计模式里面的动态代理就会用到反射的相关知识,

什么是反射

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

常见使用方式

获取class对象

获取class对象有三种方式

  1. 通过Class类的静态方法获取
  2. 通过类的class属性获取
  3. 通过对象的getClass方法获取
示例
Class<?> clazz = Class.forName("com.xpyvip.Student");
Class<Student> clazz = Student.class;
Student st = new Student();
Class<? extends Student> clazz = st.getClass();

生成类的实例对象

生成类的实例对象有两种方式

  1. 通过class对象的newInstance()来创建实例,需要类有默认的构造函数,该方法就是通过默认的构造函数来进行创建类的实例。
  2. 获取class对象的Constructor对象,再调用Constructor对象的newInstance()方法来创建类的实例,这种方式可以选择相应的构造函数来创建实例。
示例
Student st = clazz.newInstance();

Constructor<Student> declaredConstructor = clazz.getDeclaredConstructor(String.class);
Student st = declaredConstructor.newInstance("123");

获取对象的属性和方法

获取对象的属性和方法可以使用class对象中的getField()和getMethod(),这些方法还有一些延伸的方法,例如获取所有声明的,获取所有public属性等等。

调用对象的方法

调用对象的方法需要使用Method对象里面的invoke方法,该方法参数传入调用该方法的实例和方法对应的参数。

示例
Class<Student> clazz = Student.class;
Student st = clazz.newInstance();
Method method = clazz.getDeclaredMethod("setSex", String.class);
method.invoke(st, "男");

总结

使用反射可以提高代码的灵活性和可扩展性,降低了模块之间的耦合性,可以创建和控制任何类的对象,无需硬编码目标类,但是使用反射性能低、安全性低。使用反射需要jvm做一系列的操作,性能比直接写的java的代码低,而且通过反射可以获取到类的私有成员,安全性降低。