结合Spring中Beans理解Java中的反射机制

引入

都说反射机制是Java中许多框架的设计灵魂。

菜鸡(我):此话怎讲!

反射概述

在运行状态中,对于任意一个类,都能够知道其所有属性和方法;对于任意一个对象,都能够调用其任意一方法。
动态获取信息,动态调用对象方法

进一步解释

就是把Java类中的各个部分,映射成一个个的Java对象
一个类中的 成员变量方法构造方法等,利用反射方法可以把这些组成部分映射成 一个个对象

反射功能
在这里插入图片描述
反射空间
在这里插入图片描述

对Spring注解的猜测

Spring的xml注解起着很重要的作用,而xml的解析说的简单点就是得到了一些有用的字符串

Java反射的一大特点就是利用字符串就能获得类(class)

要知道Java真正运行的文件是经过编译后的 .class 文件

反射对应的方法 .forName("");

Class c = Class.forName("com.util.MathUtil");

forName的参数是对应类的全称限定名 String类型,不能写错

构造器类
Spring——xml:
在这里插入图片描述
从这段注解里我们能看出什么:


首先bean会反射出一个类

Class MathUtil = Class.forName("com.util.MarhUtil");

如果没有“constructor-arg”标签,JVM会调用MathUtil类的无参构造,但。。。

对应无参代码:

Constructor constructor = MathUtil.getConstructor();
constructor.newInstance();

有的话就是有参构造,这个不必多言:

Constructor constructor = MathUtil.getConstructor(String.class,int.class);
constructor.newInstance("abc",20);

附上MathUtil类:
在这里插入图片描述
Spring Setter注入,方法类
Spring——xml:
在这里插入图片描述
附上Computer类:
在这里插入图片描述
这段代码的property标签是将IntelCpu(实现了Cpu接口)这个对象注入给Computer,这里采用的是Setter方法注入:
IntelCpu类:
在这里插入图片描述
对应反射代码猜测:

Class computer = Class.forName("com.Computer");
Computer = (Computer) computer.newInstance();
Method method = computer.getMethod("setCpu",Cpu.class);
method.invoke(commputer,IntelCpu);//这里的IntelCpu应该也是通过反射构建的

factory-bean和factory-method标签:
ThinkPad类:
在这里插入图片描述
显而易见,还是Method方法:

Class think= Class.forName("com.ThinkPad");
ThinkPad= (ThinkPad) think.newInstance();
Method method = think.getMethod("createComputer");
method.invoke(think);

关于上述Method和Constructor在获取的时候,对应方法的权限都是public
如果权限为private呢?还能获取吗?

菜鸡(我):这指定不能了,private很安全的。

当然可以获得!

菜鸡(我):嘿嘿,我刚才卡了(我SB呵呵了)

强制反射是存在的:

ThinkPad think= (ThinkPad) c.newInstance();
Method method = think.getDeclaredMethod("createComputer");
method.setAccessible(true);//暴力反射
method.invoke(think);

所以说,private对于越无知的人越安全,。

菜鸡(我)退出了直播间~

关于反射的全面用法请参考大佬博客,里面说的很详细:
反射机制介绍
(侵权请联系我,秒删!)

That’s all,,.Thank you!!

原创文章 10 获赞 10 访问量 439

猜你喜欢

转载自blog.csdn.net/weixin_43415201/article/details/105419418