反射机制详情

简介: 反射机制详情

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

相关文章
|
边缘计算 Kubernetes Devops
KubeSphere平台安装系列之二【Linux单节点部署KubeSphere】(2/3)
KubeSphere平台安装系列之二【Linux单节点部署KubeSphere】(2/3)
703 3
|
Java 调度 开发工具
Java处理并发编程工具集合(JUC)详解 1
Java处理并发编程工具集合(JUC)详解
915 1
|
前端开发 JavaScript Java
Spring Boot中的数据校验
Spring Boot中的数据校验
|
机器学习/深度学习 自然语言处理 自动驾驶
如何看待LangChain与智能Agent,二者有什么区别
LangChain是一种专注于自然语言处理的框架,通过链式结构连接多个模型组件,实现复杂任务如问答、对话生成等。其六大核心组件包括模型、检索、代理、链、记忆和回调,帮助开发者快速构建基于大语言模型的应用。智能Agent则是一种能够感知环境、推理决策并采取行动的智能体,涵盖更广泛的智能行为,如自动驾驶、智能家居等。两者分别侧重于语言处理和全面智能行为的技术实现,为不同应用场景提供强大支持。
1021 0
|
Java Spring
运行@Async注解的方法的线程池
自定义@Async注解线程池
756 3
|
Java Spring 容器
Spring Boot 启动源码解析结合Spring Bean生命周期分析
Spring Boot 启动源码解析结合Spring Bean生命周期分析
772 11
|
Kubernetes 应用服务中间件 nginx
基于容器化的Web服务器管理
【8月更文第28天】随着云原生技术的发展,容器化已经成为部署和管理应用程序的标准方式之一。Docker 和 Kubernetes 等工具提供了强大的容器管理和编排能力,使得开发者能够轻松地部署、扩展和维护 Web 服务器。本文将详细介绍如何使用 Docker 和 Kubernetes 实现 Web 服务器的容器化部署,并提供详细的步骤和代码示例。
642 1
|
机器学习/深度学习 数据可视化 PyTorch
时空图神经网络ST-GNN的概念以及Pytorch实现
本文介绍了图神经网络(GNN)在处理各种领域中相互关联的图数据时的作用,如分子结构和社交网络。GNN与序列模型(如RNN)结合形成的时空图神经网络(ST-GNN)能捕捉时间和空间依赖性。文章通过图示和代码示例解释了GNN和ST-GNN的基本原理,展示了如何将GNN应用于股票市场的数据,尽管不推荐将其用于实际的股市预测。提供的PyTorch实现展示了如何将时间序列数据转换为图结构并训练ST-GNN模型。
1026 1
|
存储 Java API
SpringBoot + MinIO 实现文件切片极速上传技术
【8月更文挑战第19天】在现代互联网应用中,文件上传是一个常见且重要的功能。然而,随着文件体积的增大,传统的文件上传方式往往面临效率低下、耗时过长等问题。为了提升大文件上传的速度和效率,我们可以采用文件切片上传技术,并结合SpringBoot和MinIO来实现这一功能。
902 0
commons-httpclient 和 httpclient 区别
commons-httpclient 和 httpclient 区别
809 0