反射:替对象执行方法

简介: 反射:替对象执行方法

反射,可不只是利用Class创建对象哟,更重要是替对象执行方法!关于反射创建对象,它可以提供一种通用的机制,对任意Class对象得到它的实例,而不需要import。


举个例子,Spring底层就是利用反射为我们工程中的类创建实例,但Spring内部可从来没有import我们的类(事实上也不可能,世界上用Spring的工程何其多!)。


这是一种运行时创建实例的机制,可以摆脱编译依赖带来的限制,提供一种更为通用的对象创建途径。


但反射除了替类创建实例外,还有一个更为重要的能力:替对象执行方法!相比“替类创建实例”,“替对象执行方法”更能体现“反射”中“反”这个字的内涵。作为一门面向对象语言,Java的对象职责可以简略说成:封装数据和行为。而方法作为一种行为描述,是所有对象共有的,不属于某个对象独有。比如现有两个Person实例:


Person p1 = new Person();
Person p2 = new Person();

假设Person有两个字段 name、age,有一个方法:changeUser()


对象 p1保存了"hst"和18,p2保存了"cxy"和20,但是不管是p1还是p2,都会有changeUser(),而每个对象里面写一份太浪费。


既然是共性行为,可以抽取出来,放在方法区共用。但这又产生了一个棘手的问题,方法是共用的,JVM如何保证p1调用changeUser()时,changeUser()不会跑去把p2的数据改掉呢?


为了解决这个问题,Java设计了一种隐性机制,每次对象调用方法时,都会隐性传递当前调用该方法的对象参数,方法可以根据这个对象参数知道当前调用本方法的是哪个对象!


8.png

同样的,在反射调用方法时,本质还是希望方法处理数据,所以必须告诉它去处理哪个对象的数据。

9.png

反射API中,有个Method对象,它就像一个方法执行器,当你想要执行某个对象的某个方法时,根本不要求这个对象本身,而是去找到Method,告诉它:帮我找到老默,告诉他我想......


啊不,说错了,应该是:找到Method,把对象+参数告诉它,Method帮你执行。


这就像什么呢?有一个老师傅,一直不肯使出本门剑法的最后一招。正常来说,你要求他:师傅,请你调用一下剑法的最后一招让徒孙开开眼吧!


现在有了反射,你就不用求他了,直接找到Method,把师傅绑了,并且找到师傅的剑,人和剑一块儿都塞给Method,然后Method催动内力,逼着师傅拿着剑把最后一招耍出来了。


10.png

10.png

相关文章
|
7月前
|
安全 Java
java中通过反射调用普通方法和操作属性的方法
java中通过反射调用普通方法和操作属性的方法
|
16小时前
|
存储 Java 编译器
类、对象、方法
摘要: 本文介绍了面向对象编程的概念,以京东购买手机为例,展示了如何通过分类和参数选择商品,强调软件与现实生活的对应关系。柯南三步走揭示了京东如何通过搜索和筛选帮助用户找到所需商品,而这一切背后的编程思想即为面向对象编程。面向对象编程涉及抽象、自定义类型和实例化对象等步骤,其中自定义类型(如Java中的类)用于封装现实生活中的复杂数据。文章还讲解了如何定义类、实例化对象以及访问权限修饰符、构造方法、this关键字、方法的使用,强调了方法参数和返回值在不同数据类型上的处理差异。整个讨论旨在阐明Java中面向对象编程的基本原理和实践应用。
19 5
|
16小时前
调用反射类的方法
调用反射类的方法
16 3
|
16小时前
调用反射类的指定方法
调用反射类的指定方法
13 3
|
9月前
通过反射创建对应的运行时类的对象
通过反射创建对应的运行时类的对象
17 0
|
11月前
对象实例化错误
对象实例化错误
70 0
|
安全 Java
注解和反射12.动态创建对象执行方法
注解和反射12.动态创建对象执行方法
|
XML Java 数据格式
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
121 0
反射机制(什么是反射、反射操作构造器、方法、字段、反射加载资源)
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
【错误记录】反射时调用方法及成员报错 ( 执行反射方法 | 设置反射的成员变量 | 设置方法/成员可见性 )
157 0