深入解析Java反射机制的全面指南
发表时间: 2024-04-23 10:46
反射,是Java程序必会的重要技能,也是开发框架,面试的核心考点之一
今天给大家系统性讲解下反射的相关内容,想获取对应的视频讲解也可以加我免费获取
反射,顾名思义,是程序在运行时对自身结构的一种“反思”。在Java中,反射允许我们在代码执行期间动态地分析类、接口、字段和方法等组件,以及进行相应的操作,而这些信息在编译时可能并不完全可知或无需知道。通过反射API,我们可以:
Java反射机制的基础是类加载机制。当程序需要使用某个类时,JVM会通过类加载器(ClassLoader)查找对应的.class文件,将其加载到内存中,生成对应的Class对象。这个过程包括加载、验证、准备、解析和初始化五个阶段。一旦类被加载到内存,其Class对象便成为反射操作的入口。
Java反射API主要包含以下几个关键类:
下面通过示例代码演示如何使用Java反射API进行常见的反射操作:
import java.lang.reflect.*;// 示例类public class ExampleClass { private String privateField = "private field value"; public String publicField = "public field value"; private void privateMethod() { System.out.println("Called private method"); } public void publicMethod(String arg) { System.out.println("Called public method with argument: " + arg); } public static void main(String[] args) throws Exception { // 获取ExampleClass的Class对象 Class<?> exampleClass = ExampleClass.class; // **反射创建对象** Constructor<ExampleClass> constructor = exampleClass.getDeclaredConstructor(); constructor.setAccessible(true); // 允许访问私有构造器 ExampleClass instance = constructor.newInstance(); // **反射访问字段** Field privateFieldObj = exampleClass.getDeclaredField("privateField"); privateFieldObj.setAccessible(true); // 允许访问私有字段 String privateFieldValue = (String) privateFieldObj.get(instance); System.out.println("Private field value: " + privateFieldValue); Field publicFieldObj = exampleClass.getField("publicField"); String publicFieldValue = (String) publicFieldObj.get(instance); System.out.println("Public field value: " + publicFieldValue); // **反射调用方法** Method privateMethodObj = exampleClass.getDeclaredMethod("privateMethod"); privateMethodObj.setAccessible(true); // 允许访问私有方法 privateMethodObj.invoke(instance); // 调用私有方法 Method publicMethodObj = exampleClass.getMethod("publicMethod", String.class); publicMethodObj.invoke(instance, "反射调用传参"); // 调用公有方法并传参 }}
上述代码首先获取ExampleClass的Class对象,然后利用反射创建对象、访问和修改私有及公有字段,最后调用私有及公有方法。注意,对于非公开的(如私有)成员,需要通过setAccessible(true)方法取消访问检查,否则会抛出IllegalAccessException。
优点:
缺点: