广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >Java中的反射的作用以及详解
  • 390
分享到

Java中的反射的作用以及详解

java开发语言 2023-10-24 22:10:36 390人浏览 泡泡鱼
摘要

目录 目录 1.反射是什么? 2.反射的优缺点: 3.反射的应用场景: 4.反射创建的三种方式 : 5.反射的常用方法代码示例: 1.实体类(反射获取的类): 2.反射常用方法的示例代码: 1.反射是什么? Java中的反射是指在运行

目录

目录

1.反射是什么?

2.反射的优缺点:

3.反射的应用场景:

4.反射创建的三种方式 :

5.反射的常用方法代码示例:

1.实体类(反射获取的类):

2.反射常用方法的示例代码:


1.反射是什么?

Java中的反射是指在运行时动态地获取类的信息以及操作类的成员变量、方法和构造函数的能力。Java反射机制允许程序在运行时获取类的内部信息,包括类的名称、父类、实现的接口、类的字段和方法等,并且可以通过反射机制调用类中的方法和构造函数,访问或修改类中的成员变量。通过反射,可以在运行时动态地创建对象、调用方法、修改变量值等,这样就可以实现一些动态性很强的功能,例如在运行时动态地加载类、动态地调用方法等。反射机制在一些框架工具库中得到广泛应用,如spring框架、Hibernate ORM框架等。

2.反射的优缺点:

反射是Java语言的一种特性,它可以让程序在运行时动态地获取类的信息,包括类名、方法名、属性名、构造方法等,并能够通过这些信息创建对象、调用方法和修改属性等。反射的优缺点如下:

优点:

  1. 动态性:反射可以在程序运行时动态地获取类的信息,这使得程序的行为更具有灵活性和可配置性。

  2. 可扩展性:反射可以让程序在运行时动态地加载和调用类,这使得程序可以实现动态扩展和更新功能。

  3. 代码复用:反射可以让程序在运行时动态地调用类的方法和访问属性,这使得程序可以更加方便地重用代码。

  4. 框架与插件机制:反射可以使框架和插件机制更加灵活,它可以让程序在运行时动态地加载和调用类,这样就可以实现动态扩展和更新功能。

缺点:

  1. 性能:反射会带来一定的性能损失,因为反射需要在运行时动态地获取类的信息,并且需要进行类型转换和方法调用等操作,这些都会增加程序的运行时间和内存开销。

  2. 安全性:反射可以让程序访问和修改类的私有属性和方法,这可能会带来安全风险,因为这些操作可能会违反类的封装性和安全性。

  3. 可读性:反射代码通常比普通代码更难理解和维护,因为反射代码需要处理很多细节和异常情况,这可能会影响程序的可读性和可维护性。

总的来说,反射是Java语言中一个非常强大和灵活的特性,它可以让程序在运行时动态地获取类的信息,并且可以实现很多高级的功能。但是反射也有一些缺点,包括性能、安全性和可读性等方面的问题,因此在使用反射时需要权衡利弊,根据具体的业务场景来决定是否使用反射。

3.反射的应用场景:

常见的应用场景:

  1. 框架与插件机制:反射可以使框架和插件机制更加灵活,它可以让程序在运行时动态地加载和调用类,这样就可以实现动态扩展和更新功能。例如,常见的Java框架,如Spring、Hibernate和JUnit等,都使用了反射机制来实现依赖注入、ORM映射和单元测试等功能。

  2. 序列化和反序列化:反射可以在对象序列化和反序列化中使用,序列化是将对象转换为字节流的过程,而反序列化是将字节流转换为对象的过程。通过反射,可以在运行时获取对象的类型信息,并且在序列化和反序列化过程中使用这些信息来生成字节码,从而实现对象的序列化和反序列化。

  3. 动态代理:反射可以实现动态代理,动态代理是一种设计模式,它允许程序在运行时动态地创建一个代理对象,代理对象可以在不改变原始对象的情况下为其提供额外的功能。通过反射,可以动态地创建代理对象,并在代理对象上调用方法,从而实现动态代理的功能。

  4. 单元测试:反射可以在单元测试中使用,它可以让测试代码动态地调用被测试代码中的私有方法和属性,从而实现对代码的全面测试。在JUnit等单元测试框架中,就有很多使用反射机制的测试工具,如ReflectionTestUtils和Whitebox等。

4.反射创建的三种方式 :

        //反射的第一种方式        SysUser sysUser = new SysUser();        Class aClass = sysUser.getClass();        //反射的第二种方式        Class sysUserClass = SysUser.class;    //获取类模版        //反射第三种方式        Class aClass1 = Class.forName("com.ruoyi.common.core.domain.entity.SysUser");

5.反射的常用方法代码示例:

1.实体类(反射获取的类):
package com.ruoyi.common.core.domain.entity;import java.util.Date;import java.util.List;import javax.validation.constraints.*;import org.apache.commons.lang3.builder.ToStringBuilder;import org.apache.commons.lang3.builder.ToStringStyle;import com.ruoyi.common.annotation.excel;import com.ruoyi.common.annotation.Excel.ColumnType;import com.ruoyi.common.annotation.Excel.Type;import com.ruoyi.common.annotation.Excels;import com.ruoyi.common.core.domain.BaseEntity;import com.ruoyi.common.xss.Xss;public class SysUser extends BaseEntity{    private static final long serialVersionUID = 1L;        @Excel(name = "用户序号", cellType = ColumnType.NUMERIC, prompt = "用户编号")    private Long userId;        @Excel(name = "部门编号", type = Type.IMPORT)    private Long deptId;        @Excel(name = "登录名称")    private String userName;        @Excel(name = "用户名称")    private String nickName;        @Excel(name = "用户邮箱")    private String email;        @Excel(name = "手机号码")    private String phonenumber;        @Excel(name = "用户性别", readConverterExp = "0=男,1=女,2=未知")    private String sex;        private String avatar;        private String passWord;        @Excel(name = "帐号状态", readConverterExp = "0=正常,1=停用")    private String status;        private String delFlag;        @Excel(name = "最后登录IP", type = Type.EXPORT)    private String loginIp;        @Excel(name = "最后登录时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss", type = Type.EXPORT)    private Date loginDate;        @Excels({        @Excel(name = "部门名称", targetAttr = "deptName", type = Type.EXPORT),        @Excel(name = "部门负责人", targetAttr = "leader", type = Type.EXPORT)    })    private SysDept dept;        private List roles;        private Long[] roleIds;        private Long[] postIds;        private Long roleId;    public SysUser()    {    }    public SysUser(Long userId)    {        this.userId = userId;    }    public Long getUserId()    {        return userId;    }    public void setUserId(Long userId)    {        this.userId = userId;    }    public boolean isAdmin()    {        return isAdmin(this.userId);    }    public static boolean isAdmin(Long userId)    {        return userId != null && 1L == userId;    }    public Long getDeptId()    {        return deptId;    }    public void setDeptId(Long deptId)    {        this.deptId = deptId;    }    @Xss(message = "用户昵称不能包含脚本字符")    @Size(min = 0, max = 30, message = "用户昵称长度不能超过30个字符")    public String getNickName()    {        return nickName;    }    public void setNickName(String nickName)    {        this.nickName = nickName;    }    @Xss(message = "用户账号不能包含脚本字符")    @NotBlank(message = "用户账号不能为空")    @Size(min = 0, max = 30, message = "用户账号长度不能超过30个字符")    public String getUserName()    {        return userName;    }    public void setUserName(String userName)    {        this.userName = userName;    }    @Email(message = "邮箱格式不正确")    @Size(min = 0, max = 50, message = "邮箱长度不能超过50个字符")    public String getEmail()    {        return email;    }    public void setEmail(String email)    {        this.email = email;    }    @Size(min = 0, max = 11, message = "手机号码长度不能超过11个字符")    public String getPhonenumber()    {        return phonenumber;    }    public void setPhonenumber(String phonenumber)    {        this.phonenumber = phonenumber;    }    public String getSex()    {        return sex;    }    public void setSex(String sex)    {        this.sex = sex;    }    public String getAvatar()    {        return avatar;    }    public void setAvatar(String avatar)    {        this.avatar = avatar;    }    public String getPassword()    {        return password;    }    public void setPassword(String password)    {        this.password = password;    }    public String getStatus()    {        return status;    }    public void setStatus(String status)    {        this.status = status;    }    public String getDelFlag()    {        return delFlag;    }    public void setDelFlag(String delFlag)    {        this.delFlag = delFlag;    }    public String getLoginIp()    {        return loginIp;    }    public void setLoginIp(String loginIp)    {        this.loginIp = loginIp;    }    public Date getLoginDate()    {        return loginDate;    }    public void setLoginDate(Date loginDate)    {        this.loginDate = loginDate;    }    public SysDept getDept()    {        return dept;    }    public void setDept(SysDept dept)    {        this.dept = dept;    }    public List getRoles()    {        return roles;    }    public void setRoles(List roles)    {        this.roles = roles;    }    public Long[] getRoleIds()    {        return roleIds;    }    public void setRoleIds(Long[] roleIds)    {        this.roleIds = roleIds;    }    public Long[] getPostIds()    {        return postIds;    }    public void setPostIds(Long[] postIds)    {        this.postIds = postIds;    }    public Long getRoleId()    {        return roleId;    }    public void setRoleId(Long roleId)    {        this.roleId = roleId;    }    @Override    public String toString() {        return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)            .append("userId", getUserId())            .append("deptId", getDeptId())            .append("userName", getUserName())            .append("nickName", getNickName())            .append("email", getEmail())            .append("phonenumber", getPhonenumber())            .append("sex", getSex())            .append("avatar", getAvatar())            .append("password", getPassword())            .append("status", getStatus())            .append("delFlag", getDelFlag())            .append("loginIp", getLoginIp())            .append("loginDate", getLoginDate())            .append("createBy", getCreateBy())            .append("createTime", getCreateTime())            .append("updateBy", getUpdateBy())            .append("updateTime", getUpdateTime())            .append("remark", getRemark())            .append("dept", getDept())            .toString();    }}
2.反射常用方法的示例代码:
package com.ruoyi.common.core.domain.entity;import com.ruoyi.common.annotation.Excel;import java.lang.reflect.Constructor;import java.lang.reflect.Field;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class A {    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException, InvocationTargetException, InstantiationException, ClassNotFoundException, NoSuchMethodException {                //反射的第一种方式        SysUser sysUser = new SysUser();        Class aClass = sysUser.getClass();        //反射的第二种方式        Class sysUserClass = SysUser.class;    //获取类模版        //反射第三种方式        Class aClass1 = Class.forName("com.ruoyi.common.core.domain.entity.SysUser");        //判断这三个是否一样        System.out.println(aClass == sysUserClass);//true        System.out.println(aClass == aClass1);//true        //获取声明式的  例如私有的        Field userId = aClass.getDeclaredField("userId");        //暴力反射        userId.setAccessible(true);        userId.set(sysUser, 1L);   //这里不能直接写1,因为相对应的实体类是Long类型        //获取Excel注解        Excel annotation = userId.getAnnotation(Excel.class);        System.out.println("annotation.name() = " + annotation.name());//annotation.name() = 用户序号        //通过获取构造器,获取所有的构造方法        Constructor[] declaredConstructors = aClass.getDeclaredConstructors();        //遍历所有的构造方法        for (Constructor declaredConstructor : declaredConstructors) {            //获取构造方法的参数的数量是否为0            if (declaredConstructor.getParameterCount() == 0) {                System.out.println("declaredConstructor = " + declaredConstructor);                //实例 通过反射机制实例化了一个aClass的对象,并将它存储在一个Object类型的变量o中。会有 实例化异常:InstantiationException                Object o = declaredConstructor.newInstance();                SysUser o1 = (SysUser) o; //强制转换                //o1 = com.ruoyi.common.core.domain.entity.SysUser@21b8d17c[userId= deptId= userName= nickName= email= phonenumber= sex= avatar= password= status= delFlag= loginIp= loginDate= createBy= createTime= updateBy= updateTime= remark= dept=]                System.out.println("o1 = " + o1);            } else {                Object o = declaredConstructor.newInstance(2222L);                SysUser o2 = (SysUser) o;                System.out.println("o2 = " + o2);            }        }        //获取getUserId方法        Method getUserId = aClass.getDeclaredMethod("getUserId");        //调用执行        Object invoke = getUserId.invoke(sysUser);        System.out.println("invoke = " + invoke); //1    }}

来源地址:https://blog.csdn.net/m0_72568404/article/details/131765880

--结束END--

本文标题: Java中的反射的作用以及详解

本文链接: https://www.lsjlt.com/news/441880.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java中的反射的作用以及详解
    目录 目录 1.反射是什么? 2.反射的优缺点: 3.反射的应用场景: 4.反射创建的三种方式 : 5.反射的常用方法代码示例: 1.实体类(反射获取的类): 2.反射常用方法的示例代码: 1.反射是什么? Java中的反射是指在运行...
    99+
    2023-10-24
    java 开发语言
  • Java中反射机制和作用详解
    前言 很多刚学Java反射的同学可能对反射技术一头雾水,为什么要学习反射,学习反射有什么作用,不用反射,通过new也能创建用户对象。 那么接下来大师就带你们了解一下反射是什么,为什么...
    99+
    2022-11-12
  • Java中的反射机制详解
    目录一、什么是反射?二、为什么要用反射三、Class类四、获取Class类对象的四种方式五.通过反射构造一个类的实例①使用Class.newInstance②通过反射先获取构造方法再...
    99+
    2022-11-12
  • PHP中的反射机制以及如何使用反射
    在 PHP 中,反射(Reflection)是一种机制,用于在运行时动态地获取类、接口、函数、方法等的信息。反射机制允许我们在运行时分析和修改代码结构,包括类的属性和方法等。 下面是一个简单的示例,展...
    99+
    2023-10-18
    php 开发语言 后端
  • Java中的反射,枚举及lambda表达式的使用详解
    目录一、反射1.1定义1.2用途1.3反射基本信息1.4与反射相关的类1.5Class类(反射机制的起源)1.6Class类中的相关方法1.7获得Class对象的三种方式1.8反射的...
    99+
    2022-11-13
  • Java中反射动态代理接口的详解及实例
    Java语言中反射动态代理接口的解释与演示Java在JDK1.3的时候引入了动态代理机制、可以运用在框架编程与平台编程时候捕获事件、审核数据、日志等功能实现,首先看一下设计模式的UML图解:当你调用一个接口API时候,实际实现类继承该接口,...
    99+
    2023-05-31
    java 反射 动态代理
  • Java中的反射机制示例详解
    目录反射什么是Class类获取Class实例的三种方式通过反射创建类对象通过反射获取类属性、方法、构造器更改访问权限和实例赋值运用场景反射 反射就是把Java类中的各个成分映射成一个...
    99+
    2022-11-13
  • Java反射机制的功能以及举例
    这篇文章主要介绍“Java反射机制的功能以及举例”,在日常操作中,相信很多人在Java反射机制的功能以及举例问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java反射机制的功能以及举例”的疑惑有所帮助!接下来...
    99+
    2023-06-17
  • Java反射的定义和用法详解
    目录定义获取Class对象1.1 通过类名获取Class对象1.2 通过对象获取Class对象1.3 通过类字面常量获取Class对象获取类的信息2.1 获取所有字段2.2 获取指定...
    99+
    2023-05-18
    Java反射 Java反射操作
  • Java中的反射机制基本运用详解
    目录Java中的反射机制基本运用1、什么是反射(reflect)2、反射机制提供的功能3、反射->获取类对象4、反射->利用无参构造实例化对象5、反射->利用有参构...
    99+
    2022-11-12
  • Java反射机制原理、Class获取方式以及应用场景详解
    目录学习背景一、Java反射机制是什么?1.1 反射原理1.2 反射例子二、Java反射机制中获取Class的三种方式及区别?2.1 Class的几种获取方式2.2 代码演示几种方式...
    99+
    2022-11-13
  • Java 反射机制的实例详解
    Java 反射机制的实例详解前言 今天介绍下Java的反射机制,以前我们获取一个类的实例都是使用new一个实例出来。那样太low了,今天跟我一起来学习学习一种更加高大上的方式来实现。正文 Java反射机制定义Java反射机制是指在运行状态中...
    99+
    2023-05-31
    java 反射机制 ava
  • java反射的用途及实现
    本篇内容介绍了“java反射的用途及实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! 反射是什么反射是Java程序开发语言的特征...
    99+
    2023-06-15
  • AJPFX反射及反射的应用该如何理解
    本篇文章为大家展示了AJPFX反射及反射的应用该如何理解,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。怎么理解反射,反射的应用        反射就是把Jav...
    99+
    2023-06-02
  • Java反射机制在Spring IOC中的应用详解
    目录Java反射机制在SpringIOC的应用下面是Spring通过配置进行实例化对象Spring的配置如下所示实现一下Spring底层处理原理反射机制、反射机制的作用、反射机制的功...
    99+
    2022-11-12
  • Java中反射的作用是什么
    本篇内容主要讲解“Java中反射的作用是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java中反射的作用是什么”吧!前言今天说Java模块内容:反射。反射介绍正常情况下,我们知晓我们要操作...
    99+
    2023-06-15
  • 图文详解java反射机制及常用应用场景
    目录一、什么是java反射?二、Hello World三、类加载与反射关系四、操作反射的java类4.1.获取Class对象的三种方法4.2.获取Class类对象的基本信息4.3. ...
    99+
    2022-11-13
  • 详解Java编程中的反射在Android开发中的应用
    反射定义 “反射”(Reflection)能够让运行于JVM中的程序检测和修改运行时的行为。 为何需要反射 反射带来的好处包括:     在运...
    99+
    2022-06-06
    java编程 反射 JAVA android开发 Android
  • 一文详解Golang中的反射
    本篇文章带大家主要来聊聊Golang中反射,希望对你有新的认知。虽然很多人使用 Go 语言有一定时间了,甚至有的使用了 1 年 2 年,然后对于 Go 语言中的反射还是模棱两可,使用起来的时候,心里也不是非常有底气。【相关推荐:Go视频教程...
    99+
    2023-05-14
    反射 go语言 Golang
  • Golang 中反射的应用实例详解
    目录引言Golang类型设计原则Golang 中为什么要使用反射/什么场景可以(应该)使用反射举例场景:反射的基本用法反射的性能分析与优缺点测试反射结构体初始化测试结构体字段读取/赋...
    99+
    2022-11-11
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作