首页 > 其他分享 >什么是反射?

什么是反射?

时间:2024-09-04 20:52:30浏览次数:5  
标签:反射 Student 什么 class student Constructor Class

目录

反射的定义

下面是我查询到的反射的定义:

我的理解:

学习反射的要点:

Class是反射的核心类

通过字节码对象获取Field、 Method和Constructor的方法:

总结


这篇文章全属于我自己的看法呢,如果一小伙伴看到的话请批判性的来看,因为我们看法和表述不一定准确。

反射的定义

关于反射的定义这个问题,我刚开始是很懵的,因为我们平时接触到的定义往往都是什么是什么的格式来给出解释,但是我查了很多资料也没有查出有反射是什么这种句型的定义,这让我觉得反射是一个很深奥的东西,但是看了一些大神的解释之后我觉得反射在Java中就是一个具有上帝视角的工具。

下面是我查询到的反射的定义:

        反射允许对成员变量,成员方法和构造方法的信息进行编程访问。

我的理解:

        我觉得Java代码归根结底就是由一个个类组成的,而反射可以访问这些类中的信息,就包括类的属性(成员变量)、类的方法(成员方法)以及类的构造方法。而类就是由这些东西组成的,所以我说反射在Java中具有上帝视角,所有的类里面有些什么东西都能通过反射来看到。所有的类在反射面前都是透明的,即使是私有的属性或者方法也能通过反射访问到。

学习反射的要点:

        学习反射最重要的就是通过反射来获取类中的属性、方法、构造方法等,并对它们进行剖析。但是我们从类中获取这些东西并不是直接在我们平时编写的代码中直接获取而是要通过字节码对象来获取,所以我们首先要学习获取字节码对象的三种方式:

//1、Class.forName(类的完整路径)
Class clazz1 = Class.forName("com.situ.reflect.Student");
//2、类型.class
Class clazz2 = Student.class;
//对象名.getClass
Student student = new Student();
Class clazz3 = student.getClass();

         通过上面的代码可以看到获取的字节码对象都是Class类型,这就要说一下这个Class类了。

Class是反射的核心类

每个类加载到内存后,系统都会有唯一的一份字节码对象(比如Person.class/Student.class字节码对象都是Class这个类的实例)

就像是通过抽取Student类和Teacher类的共同特征我们可以抽取出一个Person类,Person类里面具有Teacher类和Student类的共同特征,我们把所有类的共同特征抽取出来就得到了Class类,那么所有的类的共同特征有哪些呢?

  • 所有的类都有属性  Field
  • 所有类都有方法    Method
  • 所有类都有构造方法  Constructor

在Class中定义了获取Field、 Method和Constructor的方法,常用的有下面几个:

通过字节码对象获取Field、 Method和Constructor的方法:

这些方法都是通过字节码对象来调用的。

public void testConstructor() {
   Class clazz = Student.class;
   Constructor[] constructors = clazz.getDeclaredConstructors();
   for (Constructor constructor : constructors) {
     System.out.println(constructor);
     System.out.println(constructor.getName());//构造方法的名字
     System.out.println(constructor.getModifiers());//修饰符
   }
}


@Test
public void testConstructor2() throws NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
    Class clazz = Student.class;
    //private Student(Integer id, String name, Integer age, String gender)
    Constructor constructor = clazz.getDeclaredConstructor(Integer.class, String.class, Integer.class, String.class);
    //在反射面前,私有的都可以访问
    constructor.setAccessible(true);
    //Student student = new Student(1, "zhansgan", 23, "男");
    Student student = (Student) constructor.newInstance(1, "zhangsan", 23, "男");
    System.out.println(student);
}
Student{id=1, name='zhangsan', age=23, gender='男'}

public void testMethod() throws ClassNotFoundException, NoSuchMethodException, SecurityException, InstantiationException, IllegalAccessException, IllegalArgumentException, InvocationTargetException {
   //Student student = new Student();
   //student.setName("lisi");
   
   Class clazz = Class.forName("com.situ.day15.Student");
   //得到无参构造方法
   Constructor constructor = clazz.getConstructor();
   //调用newInstance实例化对象
   Student student = (Student) constructor.newInstance();
   //student.setName("lisi");
   Method method = clazz.getMethod("setName", String.class);
   method.invoke(student, "lisi");
   System.out.println(student);
}

这就是Class类,以及通过Class类可以拿到的类的属性、方法、构造方法等。

那么同理,所有类的属性Field也具有共同特征:

  • 修饰符; //private
  • 类型; //String
  • 变量名字; // name

这样我们通过上面的字节码对象拿到Field之后又可以通过Field来拿到类属性中的修饰符、类型、变量名等。

通过Method可以获得方法的名字、参数、返回值。

就这样我们就可以通过反射把一个类里面所有的东西都剖析出来了,所以类在反射面前是透明的。

总结

反射的核心类Class类

获取字节码对象的3种方式

1、Class.forName(类的完整路径)
2、类型.class
3、对象名.getClass

Class类具有属性Field、Method、Constructor,通过字节码对象来获得这些属性

Field类具有属性修饰符、类型、变量名字等

Method类具有属性返回值、参数、名字等

Constructor名字,声明的注解等

标签:反射,Student,什么,class,student,Constructor,Class
From: https://blog.csdn.net/weixin_72280926/article/details/141902573

相关文章

  • 什么是伺服系统
        伺服系统(Servomechanism),又称随动系统,是一种用于精确地跟随或复现某个过程的反馈控制系统。该系统通过接收输入目标(或给定值)的指令,并控制被控量(如物体的位置、方位、状态等)以跟随这些指令的变化,实现高精度的控制。以下是对伺服系统的详细解析:一、基本概念伺服系统......
  • 对象存储服务器有什么作用
    对象存储服务器(ObjectStorageServer)是专为存储、管理和检索大量非结构化数据(如文档、图片、音频、视频等)设计的存储解决方案。以下是对象存储服务器的主要作用:1.存储大量非结构化数据对象存储能够高效地处理和存储大量的非结构化数据,这是传统文件系统或块存储难以比拟的。2.数......
  • 给陌生的外国人发英语邮件需要注意什么
    给陌生的外国人发英语邮件时,为了确保专业性、得体性和有效性,应注意以下几个关键点:正确的称谓:使用正式且礼貌的称谓,如“DearMr./Ms./Dr.[LastName]”,如果对方的性别和头衔未知,可以用全名或者“Dear[FirstName][LastName]”。避免使用过于随意的称呼,如“Hi”或“Hey”。个性化......
  • Q2财报发布|盘后大涨16%!GitLab凭什么?
    9月3日,GitLabInc.(NASDAQ:GTLB)发布第二季度财报,报告显示GitLab第二季度营收同比增长31%,超出预期600万美元左右,GAAP营业利润率同比改善17%!GitLab财报一经发出,盘后股价暴涨16%!这并不是GitLab第一次有如此强劲的表现。GitLab自2021年10月在纳斯达克上市以来,从其对外公开披露的......
  • 我是一个连续创业者——为什么我认为AI正在带来副业的黄金时代
    本周,EdelmanData和三星移动发布的新研究表明,我们即将进入“AI驱动副业”的新时代。这项研究收集了来自美国、法国、德国、英国和韩国的数千名Z世代的在线调查反馈,发现大多数人对当前的工作条件感到不满意,这不禁让人意外。这项调查显示,大约70%的人对现状不满,考虑使用AI作为他......
  • 软件开发过程中 Alpha、Beta、RC、Stable 版本都有什么区别?
    在传统软件开发过程中,软件版本周期可分为三个阶段,分别是:α、β、λ。Alpha(α):内部测试版。这个是最早的版本,这个版本包含很多BUG功能也不全,主要是给开发人员和测试人员测试和找BUG用的。Beta(β):公开测试版。这个版本比Alpha版发布得晚一些,主要是给社区用户和忠实用户测......
  • 异源数据同步 → DataX 为什么要支持 kafka?
    开心一刻昨天发了一条朋友圈:酒吧有什么好去的,上个月在酒吧当服务员兼职,一位大姐看上了我,说一个月给我10万,要我陪她去上海,我没同意朋友评论道:你没同意,为什么在上海?我回复到:上个月没同意前情回顾关于DataX,官网有很详细的介绍,鄙人不才,也写过几篇文章异构数据源同步之数据同步→da......
  • 企业内部社区在企业起到什么作用?
    企业内部社区是传播企业文化、促进员工互动和提升员工参与度的重要平台。通过企业内部社区,员工可以更好地理解和认同企业的核心价值观和文化理念,增强凝聚力和团队合作精神,进而提升企业的绩效和竞争力。企业内部社区有助于营造积极向上的工作氛围,促进信息共享、知识传递和创新协作,为......
  • 手游后端架构中,用命令模式解决什么问题
    Hello,大家好,我是V哥。命令模式(CommandPattern)是一种行为设计模式,它将一个请求封装为一个对象,从而允许用户使用不同的请求、队列或日志请求来参数化其他对象。命令模式也支持可撤销的操作。在手游后端架构中,命令模式可以将玩家的操作请求(如移动、攻击、技能释放等)封装成......
  • 为什么SpringBoot的 jar 可以直接运行?
     SpringBoot应用程序被打包成的jar包之所以可以直接通过 java-jar 命令运行,是因为SpringBoot在构建过程中做了一些特殊的设计和配置。具体原因:Fat/UberJAR:SpringBoot使用maven插件spring-boot-maven-plugin(或Gradle对应的插件)将项目及其所有依赖项打包成一个单一......