反射机制详情

简介: 反射机制详情

反射机制详情
6/100
发布文章
weixin_69252724
未选择文件

反射

一、 背景

在之前, 仅仅知道一个类名就可以得到类的信息
例如:

`     1. <servlet class="">/<servlet>
    2. <select id=""  resultType="">
    3. mybatis里的session.getMapper(Mapper绑定的Dao接口)

在框架里, 需要创建不同的对象, 所以就需要一个方法, 对不同的类的地址创建对象, 这样框架就以不变应万变

有时候我们知道要创建什么对象, 直接可以new创建就行, 此时我们通过类的Class对象来获取类里的属性方法, 提高代码复用性

二、 概念

反射: 在程序运行过程中,动态获取类的信息,以及创建类的对象, 调用对象的属性方法
作用:动态获取类的信息 

三、. 反射

User.java 通过编译 成User.class
.class文件只要被虚拟机加载到内存里就在堆里被创建出一个Class类对象

通过Class对象可以获取类里的信息

反射就是把类中的各个成分映射成一个个Java对象, 通过Class对象调用他们

四、获取类的class对象

  1. 通过对象名获取

    USer user = new User();

    Class u = user.getClass();

  2. 通过类名.class获取类的Class对象

    Class u2 = User.class();

  3. 通过Class.forName("类名获取")

    Class u3 = Class.forName("com.jwq.reflect.User")

1、通过class对象获取构造方法对象

    //获取公共的构造方法
    Constructor constructor = u1.getConstructor();
    Constructor constructor2 = u1.getConstructor(String.class, int.class, String.class);
    //获取私有的构造方法 也可以获取公共构造
    Constructor constructor3 = u1.getDeclaredConstructor();
    //设置对私有权限的构造方法进行操作
    constructor3.setAccessible(true);
    //通过构造方法来创建对象
    Object user = constructor.newInstance();
    Object user2 = constructor2.newInstance("Nelson",19,"男");

2. class对象获取属性对象

     getField("指定字段)
     getDeclaredFields("指定字段")
     getFields()
     getDeclaredFields()

可以通过field.set(对象,属性值)来强制封装 , 会打破原有程序的封装性

3. 通过Class对象获取啊方法对象

        Constructor constructor = u.getDeclaredConstructor();
        constructor.setAccessible(true);
        Object user = constructor.newInstance();
        //---------------------------------
        Method setName = u.getMethod("setName", String.class);
        //---------------------------------
        setName.invoke(user, "老铁"); // invoke(对象名,参数值)

五、反射优缺点

优点:

  1. 增加代码灵活性,复用性 , 通过使用类的Class对象来对属性方法进行调用 , 如: Mybatis的getMapper(Mapper.class)的动态代理, 可以对任意的类进行操作
  2. 可以在运行期间获取类的属性,方法, 通过反射动态调用修改

缺点:

  1. 反射会对类信息类型的动态解析, 使得程序性能降低
  2. 由于反射可以直接给类的属性赋值, 所以要在安全的情况下使用
  3. 反射可以打破原有的访问权限的限制, 破坏代码的封装性

注意:

要使用反射机制, 那么类里的属性对用的set,get方法都需要是标准名字, 不然会调用不到

反射
一、 背景
在之前, 仅仅知道一个类名就可以得到类的信息
例如:

` 1. /

2. <select id=""  resultType="">
3. mybatis里的session.getMapper(Mapper绑定的Dao接口)

在框架里, 需要创建不同的对象, 所以就需要一个方法, 对不同的类的地址创建对象, 这样框架就以不变应万变

有时候我们知道要创建什么对象, 直接可以new创建就行, 此时我们通过类的Class对象来获取类里的属性方法, 提高代码复用性

二、 概念
反射: 在程序运行过程中,动态获取类的信息,以及创建类的对象, 调用对象的属性方法
作用:动态获取类的信息

三、. 反射
User.java 通过编译 成User.class
.class文件只要被虚拟机加载到内存里就在堆里被创建出一个Class类对象

通过Class对象可以获取类里的信息

反射就是把类中的各个成分映射成一个个Java对象, 通过Class对象调用他们

四、获取类的class对象
通过对象名获取

USer user = new User();

Class u = user.getClass();

通过类名.class获取类的Class对象

Class u2 = User.class();

通过Class.forName(“类名获取”)

Class u3 = Class.forName(“com.jwq.reflect.User”)

1、通过class对象获取构造方法对象
//获取公共的构造方法
Constructor constructor = u1.getConstructor();
Constructor constructor2 = u1.getConstructor(String.class, int.class, String.class);
//获取私有的构造方法 也可以获取公共构造
Constructor constructor3 = u1.getDeclaredConstructor();
//设置对私有权限的构造方法进行操作
constructor3.setAccessible(true);
//通过构造方法来创建对象
Object user = constructor.newInstance();
Object user2 = constructor2.newInstance("Nelson",19,"男");

  1. class对象获取属性对象
    getField("指定字段)
    getDeclaredFields("指定字段")
    getFields()
    getDeclaredFields()
    可以通过field.set(对象,属性值)来强制封装 , 会打破原有程序的封装性

  2. 通过Class对象获取啊方法对象

     Constructor constructor = u.getDeclaredConstructor();
     constructor.setAccessible(true);
     Object user = constructor.newInstance();
     //---------------------------------
     Method setName = u.getMethod("setName", String.class);
     //---------------------------------
     setName.invoke(user, "老铁"); // invoke(对象名,参数值)
    

    五、反射优缺点
    优点:

增加代码灵活性,复用性 , 通过使用类的Class对象来对属性方法进行调用 , 如: Mybatis的getMapper(Mapper.class)的动态代理, 可以对任意的类进行操作
可以在运行期间获取类的属性,方法, 通过反射动态调用修改
缺点:

反射会对类信息类型的动态解析, 使得程序性能降低
由于反射可以直接给类的属性赋值, 所以要在安全的情况下使用
反射可以打破原有的访问权限的限制, 破坏代码的封装性
注意:

要使用反射机制, 那么类里的属性对用的set,get方法都需要是标准名字, 不然会调用不到

相关文章
|
7天前
|
人工智能 JavaScript Linux
【Claude Code 全攻略】终端AI编程助手从入门到进阶(2026最新版)
Claude Code是Anthropic推出的终端原生AI编程助手,支持40+语言、200k超长上下文,无需切换IDE即可实现代码生成、调试、项目导航与自动化任务。本文详解其安装配置、四大核心功能及进阶技巧,助你全面提升开发效率,搭配GitHub Copilot使用更佳。
|
1天前
|
JSON API 数据格式
OpenCode入门使用教程
本教程介绍如何通过安装OpenCode并配置Canopy Wave API来使用开源模型。首先全局安装OpenCode,然后设置API密钥并创建配置文件,最后在控制台中连接模型并开始交互。
|
9天前
|
存储 人工智能 自然语言处理
OpenSpec技术规范+实例应用
OpenSpec 是面向 AI 智能体的轻量级规范驱动开发框架,通过“提案-审查-实施-归档”工作流,解决 AI 编程中的需求偏移与不可预测性问题。它以机器可读的规范为“单一真相源”,将模糊提示转化为可落地的工程实践,助力开发者高效构建稳定、可审计的生产级系统,实现从“凭感觉聊天”到“按规范开发”的跃迁。
1418 15
|
8天前
|
人工智能 JavaScript 前端开发
【2026最新最全】一篇文章带你学会Cursor编程工具
本文介绍了Cursor的下载安装、账号注册、汉化设置、核心模式(Agent、Plan、Debug、Ask)及高阶功能,如@引用、@Doc文档库、@Browser自动化和Rules规则配置,助力开发者高效使用AI编程工具。
1166 5
|
6天前
|
云安全 安全
免费+限量+领云小宝周边!「阿里云2026云上安全健康体检」火热进行中!
诚邀您进行年度自检,发现潜在风险,守护云上业务连续稳健运行
1177 2
|
9天前
|
消息中间件 人工智能 Kubernetes
阿里云云原生应用平台岗位急招,加入我们,打造 AI 最强基础设施
云原生应用平台作为中国最大云计算公司的基石,现全面转向 AI,打造 AI 时代最强基础设施。寻找热爱技术、具备工程极致追求的架构师、极客与算法专家,共同重构计算、定义未来。杭州、北京、深圳、上海热招中,让我们一起在云端,重构 AI 的未来。
|
11天前
|
IDE 开发工具 C语言
【2026最新】VS2026下载安装使用保姆级教程(附安装包+图文步骤)
Visual Studio 2026是微软推出的最新Windows专属IDE,启动更快、内存占用更低,支持C++、Python等开发。推荐免费的Community版,安装简便,适合初学者与个人开发者使用。
1215 11