反射概念与基本使用
- 1 概述
- 2 基本概念
- 2.1 基本概念
- 2.2 反射的核心类
- 3 使用发射的基本方式
- 3.1 获取Class类的实例
- 3.2 访问字段
- 3.3 调用方法
- 3.4 调用构造方法
- 4 示例代码
- 5 总结
大家好,我是欧阳方超,公众号同名。

1 概述
反射是Java中的一个重大特性,它运行程序在运行时获取类的信息、创建实例、调用方法、访问及设置成员变量的值,反射在框架和库中被广泛使用。
2 基本概念
2.1 基本概念
类的元数据:反射允许在运行时获取类的结构信息,包括类名、方法、字段等。
动态性:可以在运行时创建对象、调用方法,而无需在编译时知道具体的类或方法。
2.2 反射的核心类
Class:代表一个类的字节码信息,包括类的字段、方法、构造方法等元信息。
Field、Method、Constructor:分别表明类的成员变量、方法和构造方法的元信息。
3 使用发射的基本方式
3.1 获取Class类的实例
程序中每个类都是Class类的一个实例,通过这个实例可以获取有关类的信息,列如类的名称、字段、方法、构造函数等。获取Class类的实例是使用反射的第一步,获取Class类的实例有三种方式。
Class<?> c = Class.forName(“com.example.User”); // 动态加载 Class<?> c = User.class; // 已知类型
Class<?> c = new User().getClass(); // 通过实例获取
3.2 访问字段
Field f = c.getDeclaredField(“name”); // 获取私有字段需 – 调用 setAccessible(true)
f.setAccessible(true); // 若字段是私有的,需要绕过访问控制
Object value = f.get(instance); // 获取字段值
f.set(instance, “新值”); // 修改字段值
3.3 调用方法
Method m = c.getDeclaredMethod(“setName”, String.class);
m.setAccessible(true);
m.invoke(instance, “张三”); // 调用带参数的方法
对无参方法: Method m2 = c.getDeclaredMethod(“doSomething”); m2.invoke(instance);
3.4 调用构造方法
Constructor cons = c.getDeclaredConstructor();
cons.setAccessible(true);
T obj = cons.newInstance(); // 通过指定构造参数创建对象
4 示例代码
下面的示例展示了通过反射方式获取类的信息、创建对象、访问字段和调用方法。
package com.example.demo;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) {
try {
//获取Class对象
Class clazz = Class.forName("com.example.demo.Person");
//创建实例
Object personInstance = clazz.getDeclaredConstructor().newInstance();
//访问字段
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);//设置允许访问自由字段
nameField.set(personInstance, "张三");//为私有字段设置值
//调用方法
Method greetMethod = clazz.getDeclaredMethod("greet");
greetMethod.setAccessible(true);
greetMethod.invoke(personInstance);
} catch (Exception e) {
e.printStackTrace();
}
}
}
class Person {
protected String name;
private void greet() {
System.out.println("how are you, " + name);
}
}
程序输出结果:
how are you, 张三
5 总结
Java反射是一个强劲的特性,能够在运行时动态操作类和对象。虽然它带来了灵活性,但也伴随着性能开销和安全性问题,列如,可以绕过访问控制,破坏封装,也会降低代码可读性。在实际应用中,合理使用反射可以大大提升程序的动态性和可扩展性,但应注意其潜在的缺陷和影响。
我是欧阳方超,把事情做好了自然就有兴趣了,如果你喜爱我的文章,欢迎点赞、转发、评论加关注。我们下次见。


