【反射机制】

0.常用方法

0.1Class类

方法签名 核心作用 典型使用场景
Class<?> forName(String className) 全类名加载类(静态方法) 动态加载类(如 Class.forName("com.example.Student")
Class<?> getClass() 通过对象获取类对象 Student s = new Student(); Class<?> clazz = s.getClass();
Class<?> getSuperclass() 获取父类的 Class 对象 查看类的继承关系(如 clazz.getSuperclass()
Class<?>[] getInterfaces() 获取实现的所有接口 JDK 动态代理中指定接口(如 proxy.newProxyInstance(..., clazz.getInterfaces(), ...)
Field[] getFields() 获取所有公有(public) 属性 仅读取类的 public 成员变量
Field[] getDeclaredFields() 获取所有属性(包括 private/protected) 通用属性拷贝(如 DTO→VO 对拷)
Field getField(String name) 获取指定名称的公有属性 精准读取单个 public 属性
Field getDeclaredField(String name) 获取指定名称的任意属性 读取 / 修改 private 属性
Method[] getMethods() 获取所有公有方法(含父类继承的) 调用类的 public 方法
Method[] getDeclaredMethods() 获取所有方法(包括 private/protected) 调用类的私有方法
Method getMethod(String name, Class<?>... paramTypes) 获取指定名称 + 参数的公有方法 调用 public void login(String, String)
Method getDeclaredMethod(String name, Class<?>... paramTypes) 获取指定名称 + 参数的任意方法 调用 private 方法
Constructor<?>[] getConstructors() 获取所有公有构造器 创建公有构造器的实例
Constructor<?>[] getDeclaredConstructors() 获取所有构造器(包括私有) 创建私有构造器的单例对象
Constructor<T> getConstructor(Class<?>... paramTypes) 获取指定参数的公有构造器 Constructor<Student> c = clazz.getConstructor(String.class, int.class);
Constructor<T> getDeclaredConstructor(Class<?>... paramTypes) 获取指定参数的任意构造器 调用私有构造器(如单例模式)
T newInstance() 创建类的实例(无参构造) 简化实例化(JDK9 后标记为过时,推荐用构造器)
boolean isInstance(Object obj) 判断 obj 是否是该类的实例 替代 obj instanceof Class
boolean isAssignableFrom(Class<?> cls) 判断当前类是否是 cls 的父类 / 接口 类型兼容性判断(如 List.class.isAssignableFrom(ArrayList.class)

0.2Field类

方法签名 核心作用 典型使用场景
void setAccessible(boolean flag) 打破封装,允许访问私有属性 读写 private 属性(必须先调用)
Object get(Object obj) 从 obj 中获取该属性的值 DTO→VO 拷贝时读取源对象属性值
void set(Object obj, Object value) 给 obj 的该属性设置值 DTO→VO 拷贝时给目标对象赋值
String getName() 获取属性名称 遍历属性时打印 / 匹配属性名
Class<?> getType() 获取属性的类型(如 String/int) 属性拷贝时校验类型是否匹配
int getModifiers() 获取属性的修饰符(如 public/private) 判断属性是否是 static/final

0.3Method类

方法签名 核心作用 典型使用场景
void setAccessible(boolean flag) 允许调用私有方法 调用类的 private 方法
Object invoke(Object obj, Object... args) 调用 obj 的该方法,传入参数 args 动态代理中调用目标方法(method.invoke(target, args)
String getName() 获取方法名称 日志打印方法名(如 Before: + method.getName())
Class<?> getReturnType() 获取方法的返回值类型 校验方法返回值是否符合预期
Class<?>[] getParameterTypes() 获取方法的参数类型数组 动态匹配方法参数
int getModifiers() 获取方法的修饰符(如 public/static) 判断方法是否是 static/final

0.4Consturctor类

方法签名 核心作用 典型使用场景
void setAccessible(boolean flag) 允许调用私有构造器 创建单例类的实例(私有构造器)
T newInstance(Object... args) 通过构造器创建实例,传入参数 替代 Class.newInstance()(支持有参构造)
String getName() 获取构造器所属类的名称 日志打印构造器所属类
Class<?>[] getParameterTypes() 获取构造器的参数类型数组 匹配有参构造器的参数

一.运行时,动态创建需要的类

code:

java 复制代码
public class MyBeanFactoryImpl implements MyBeanFactory {
    @Value("${class.name}")
    String className;

    public String getClassName() {
        return className;
    }
    public Object getBean() throws Exception {
        Class<?> clazz = Class.forName(className);
        Constructor<?> constructor = clazz.getConstructor();
        return constructor.newInstance();
    }
}

二.交换两个相同类的属性值

java 复制代码
package org.example.reflect.MyBeanFactoryTest;

import org.example.reflect.bean.User;
import org.junit.jupiter.api.Test;

import java.lang.reflect.Field;

public class SwapTwoUserAttributionTest {
    @Test
    public void testSwapTwoUserAttribution() throws Exception {
        User user1 = new User("张三", 18, "男");
        User user2 = new User("李四", 19, "女");

        Field[] user1Fields = user1.getClass().getDeclaredFields();
        Field[] user2Fields = user2.getClass().getDeclaredFields();
        //交换两个相同类的属性值
        for (int i = 0; i < user1Fields.length; i++) {
            Field user1Field = user1Fields[i];
            Field user2Field = user2Fields[i];
            user1Field.setAccessible(true);
            user2Field.setAccessible(true);
            Object temp = user1Field.get(user1);
            user1Field.set(user1, user2Field.get(user2));
            user2Field.set(user2, temp);
        }
        System.out.println("交换后的两个对象:");
        System.out.println(user1);
        System.out.println(user2);
    }
}
相关推荐
Alice-YUE1 分钟前
【JS高频八股】什么是闭包?
开发语言·javascript·笔记·学习
m0_495496413 分钟前
C#怎么操作音频文件 C#如何用NAudio播放录制和处理WAV MP3音频文件【工具】
jvm·数据库·python
呱牛do it11 分钟前
企业级门户网站设计与实现:基于SpringBoot + Vue3的全栈解决方案(Day 7)
java·vue
D_C_tyu14 分钟前
JavaScript | 数独游戏核心算法实现
javascript·算法·游戏
海天鹰16 分钟前
EXIF-JS
javascript
NE_STOP18 分钟前
Redis--SDS字符串与集合的底层实现原理
java
直奔標竿22 分钟前
Java开发者AI转型第二十二课!Spring AI 个人知识库实战(一)——架构搭建与核心契约落地
java·人工智能·后端·spring·架构
身如柳絮随风扬25 分钟前
深入理解Java IO与NIO的区别:从BIO到NIO的演进
java·nio
清汤饺子29 分钟前
【译】我的 AI 进阶之路:从怀疑到深度整合
前端·javascript·后端
dFObBIMmai35 分钟前
CSS如何检测页面浮动元素位置_使用审查工具与clear
jvm·数据库·python