反射

概述

在 Java 中,反射(Reflection)是一种强大的机制,允许程序在运行时检查和操作类、接口、字段、方法等的结构。通过反射,程序可以在运行时获取对象的类信息、调用类的方法、访问和修改类的字段等。

使用反射

获得class对象

1.使用 类名.class,可以直接获取一个类的 Class 对象。

1
2
Class<User> userClass = User.class;
System.out.println(userClass);

image-20250726175125300

2.使用 对象.getClass(),可以获取某个对象的 Class 对象。

1
2
3
User user = new User();
Class<? extends User> aClass = user.getClass();
System.out.println(aClass1);

image-20250726175440961

3.使用 Class.forName(“类的全限定名”),可以获取一个类的 Class 对象(需要抛异常)。

1
2
Class<?> user1 = Class.forName("User");//forName("包名.类名")
System.out.println(user1);

image-20250726175819003

获取构造器 方法、属性

构造函数

获取所有构造函数

1
2
3
4
Constructor[] declaredConstructors = userClass2.getDeclaredConstructors();
for (Constructor constructor : declaredConstructors) {
System.out.println(constructor);
}

获取公开构造函数

1
2
3
4
Constructor<?>[] constructors = userClass2.getConstructors();
for (Constructor constructor:constructors){
System.out.println(constructor);
}

获取无参构造

1
2
Constructor<User> constructor = userClass2.getConstructor();
System.out.println(constructor);

获取有参构造

1
2
Constructor<User> declaredConstructor = userClass2.getDeclaredConstructor(String.class,Integer.class);
System.out.println(declaredConstructor);
方法名 含义
getConstructors() 获取所有 public 的构造方法(包括从父类继承来的)
getDeclaredConstructors() 获取这个类自己定义的所有构造方法(不管访问权限)
getConstructor(Class<?>... parameterTypes) 获取一个public的构造方法(根据参数类型)
getDeclaredConstructor(Class<?>... parameterTypes) 获取这个类中定义的一个构造方法(不管访问权限)

方法

获取所有方法

1
2
3
4
Method[] declaredMethods = userClass2.getDeclaredMethods();
for (Method declaredMethod : declaredMethods){
System.out.println(declaredMethod);
}

获取所有公开方法,包括继承

1
2
3
4
Method[] methods = userClass2.getMethods();
for (Method method : methods){
System.out.println(method);
}

根据方法名获得方法

1
2
Method declaredMethod = userClass2.getDeclaredMethod("pri2", String.class, Integer.class);
System.out.println(declaredMethod);

根据方法名获得公有方法

1
2
Method method = userClass2.getMethod("pri1");
System.out.println(method);
方法名 含义
getMethods() 获取所有 public 方法(包括继承来的)
getDeclaredMethods() 获取这个类自己定义的所有方法(不管访问权限)
getMethod(String name, Class<?>... parameterTypes) 获取一个 public 的方法(根据名字和参数)
getDeclaredMethod(String name, Class<?>... parameterTypes) 获取这个类自己定义的某个方法(不管访问权

属性

获得所有属性

1
2
3
4
Field[] declaredFields = userClass2.getDeclaredFields();
for (Field declaredField : declaredFields){
System.out.println(declaredField);
}

获得所有公有属性

1
2
3
4
Field[] fields = userClass2.getFields();
for (Field field : fields){
System.out.println(field);
}

根据属性名获得属性

1
2
Field declaredField = userClass2.getDeclaredField("email");
System.out.println(declaredField);

根据属性名获得公有属性

1
2
Field field = userClass2.getField("address");
System.out.println(field);
方法名 含义
getFields() 获取所有 public 的字段(包括继承来的)
getDeclaredFields() 获取这个类自己定义的所有字段(不管访问权限)
getField(String name) 获取一个 public 的字段(根据字段名)
getDeclaredField(String name) 获取这个类自己定义的某个字段(不管访问权限

创建实例

通过类.newInstance()方法创建对象

创建无参实例

1
2
Object user3 = userClass3.newInstance();
System.out.println(user3);

创建有参实例

1
2
3
Constructor<User> declaredConstructor1 = userClass3.getDeclaredConstructor(String.class, Integer.class);
User user4 = declaredConstructor1.newInstance("xiaowu",21);
System.out.println(user4);

调用方法和访问字段

调用方法

使用Method.invoke("实例对象名","参数")函数进行调用方法

1,获取类

2,创建对象

3,获取方法

4,调用方法

如果是实例方法必须要创建对象实例,如果是静态方法则不用

1
2
3
4
5
6
7
8
Constructor<User> declaredConstructor1 = userClass3.getDeclaredConstructor(String.class, Integer.class);
User user4 = declaredConstructor1.newInstance("xiaowu",21);
System.out.println(user4);


System.out.println("-----调用类中的方法-----");
Method declaredMethod1 = userClass3.getDeclaredMethod("pri2", String.class);
declaredMethod1.invoke(user4,"dis");

访问字段

使用 Field.get() 和 Field.set() 可以获取和设置字段的值。

设置某个字段的值

1
2
3
4
5
6
Class c = User.class;
Object o = c.getConstructor().newInstance(); //创建对象实例
Field ageField = c.getDeclaredField("age"); //获取字段
ageField.setAccessible(true); //设置权限能被反射机制访问
ageField.set(o,20); //设置值
System.out.println(o); //输入对象实例

获取某个字段的值

1
2
3
4
5
Class c = User.class;
Object o = c.getConstructor().newInstance();
Field usernameField = c.getDeclaredField("username");
usernameField.setAccessible(true);
System.out.println(usernameField.get(o));

setAccessible的作用

setAccessible 方法是 Java 反射 API 中的一个重要方法,用于更改反射对象的可访问性标志。它主要用于访问类的私有或受保护的成员(字段、方法、构造器),使得这些成员可以被反射机制访问,即使它们原本的访问权限是不允许的。


反射
http://xiaowu5.cn/2025/12/04/反射/
作者
5
发布于
2025年12月4日
许可协议
BY XIAOWU