反射机制详情

简介: 反射机制详情

反射机制详情
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方法都需要是标准名字, 不然会调用不到

相关文章
|
13天前
|
数据采集 人工智能 安全
|
8天前
|
编解码 人工智能 自然语言处理
⚽阿里云百炼通义万相 2.6 视频生成玩法手册
通义万相Wan 2.6是全球首个支持角色扮演的AI视频生成模型,可基于参考视频形象与音色生成多角色合拍、多镜头叙事的15秒长视频,实现声画同步、智能分镜,适用于影视创作、营销展示等场景。
647 4
|
8天前
|
机器学习/深度学习 人工智能 前端开发
构建AI智能体:七十、小树成林,聚沙成塔:随机森林与大模型的协同进化
随机森林是一种基于决策树的集成学习算法,通过构建多棵决策树并结合它们的预测结果来提高准确性和稳定性。其核心思想包括两个随机性:Bootstrap采样(每棵树使用不同的训练子集)和特征随机选择(每棵树分裂时只考虑部分特征)。这种方法能有效处理大规模高维数据,避免过拟合,并评估特征重要性。随机森林的超参数如树的数量、最大深度等可通过网格搜索优化。该算法兼具强大预测能力和工程化优势,是机器学习中的常用基础模型。
350 164
|
7天前
|
机器学习/深度学习 自然语言处理 机器人
阿里云百炼大模型赋能|打造企业级电话智能体与智能呼叫中心完整方案
畅信达基于阿里云百炼大模型推出MVB2000V5智能呼叫中心方案,融合LLM与MRCP+WebSocket技术,实现语音识别率超95%、低延迟交互。通过电话智能体与座席助手协同,自动化处理80%咨询,降本增效显著,适配金融、电商、医疗等多行业场景。
359 155