专栏首页转行程序员围绕Java反射,BAT的面试官可以问出多少花样

围绕Java反射,BAT的面试官可以问出多少花样

好久不见,在疫情的控制下,我急需一杯奶茶续续命!

作者:王炸 |【坚持1000篇原创】

2020.2.21 王炸的第60篇原创

☝️先赞后看是技术人的传统美德☝️

有小朋友问我,我刚刚学Java,没接触过项目,也没机会用Spring之类的框架,看书也知道反射都有什么内容,哪本书都说反射很有用,但到现在都不知道它用在啥上面,所以,反射有啥用?

关于反射,我必须要吐槽一下,初学的时候如果靠看xxx从入门到精通系列的书,理解反射可太TM困难了,看的我怀疑人生,那个时候我一度怀疑,我该不是个智障吧!

今天来分析下:围绕Java反射,BAT的面试官可以问出多少花样。

反射关系到Java的语言特性,jvm的内存细节

JVM:只能跑Java代码的CPU

刚刚开始我也不理解Java的虚拟机到底算个什么东西?

第一节接触这东西一脸困惑,字节码代码是在CPU上执行?在虚拟机上执行?虚拟机又是个什么东西?

后来我慢慢试着理解:JVM就是跑才CPU上的一个虚拟CPU,但是这个CPU只能跑Java代码

Java之所以能跨平台就是因为这个东西,你可以理解成一个进程,程序,只不过他的作用是用来跑你的代码的。

上图是java的内存模型,我们关注的点,一个方法区,一个栈,一个堆,初学的时候老师不深入的话只告诉你java的内存分为堆和栈

假如你写了一段代码:String s=new String();

运行了起来!这里面发生了什么?

  1. 首先JVM会启动,你的代码会编译成一个xxx.class文件。
  2. 然后被类加载器加载进jvm的内存中(虚拟CPU),你的类Object加载到方法区中,创建了Object类的class对象到堆中,注意这个不是new出来的对象,而是类的类型对象每个类只有一个class对象,作为方法区类的数据结构的接口。 ⚠️注意:jvm创建对象前,会先检查类是否加载,寻找类对应的class对象,若加载好,则为你的对象分配内存,初始化也就是代码:new Object()。

上面的流程就是你自己写好的代码扔给jvm去跑,跑完就over了,jvm关闭,你的程序也停止了。

为什么会发明反射这种技术?

想想上面的程序对象是自己new的,程序相当于写死了给jvm去跑,程序员都是聪明的动物,还有没有更好的办吧不用写死,不用new。

假如一个服务器上突然遇到某个请求哦要用到某个类,哎呀但没加载进jvm,是不是要停下来自己写段代码,new一下,哦启动一下服务器,(脑残)!

这个时候反射技术诞生了,这在当时,是一个非常先进的理念,Java也因此得到更多人认可。

反射是什么呢?

当我们的程序在运行时,需要动态的加载一些类这些类可能之前用不到所以不用加载到jvm,而是在运行时根据需要才加载,这样的好处对于服务器来说不言而喻。

Java的反射机制是在编译并不确定是哪个类被加载了,而是在程序运行的时候才加载、探知、自审。使用在编译期并不知道的类。这样的特点就是反射。

有两个程序员,一个程序员在写程序的时候,需要使用第二个程序员所写的类,但第二个程序员并没完成他所写的类,这时第一个程序员不能通过编译,但是利用反射就可以通过。原因是java的反射机制它知道类的基本结构,这种对Java类结构探知的能力,我们称为Java类的“自审”。

举个例子:

我们的项目底层有时是用Mysql,有时用oracle,需要动态地根据实际情况加载驱动类,这个时候反射就有用了。

假设 com.java.dbtest.myqlConnection,com.java.dbtest.oracleConnection这两个类我们要用。

这时候我们的程序就写得比较动态化,通过Class tc = Class.forName("com.java.dbtest.TestConnection");

通过类的全类名让jvm在服务器中找到并加载这个类,而如果是oracle则传入的参数就变成另一个了。

这时候就可以看到反射的好处了,这个动态性就体现出java的特性了!

举多个例子,大家如果接触过spring,会发现当你配置各种各样的bean时,是以配置文件的形式配置的,你需要用到哪些bean就配哪些,spring容器就会根据你的需求去动态加载,你的程序就能健壮地运行。

好吧,围绕Java反射,BAT的面试官可以问出多少花样

面试:Java反射机制在Spring IOC中的应用

IOC:即“控制反转”,不是什么技术,而是一种思想。

使用IOC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。

IOC底层实现的原理(反射),Bean容器的实现,就不对IOC的概念进行详述了。

在Spring的配置文件中,经常看到如下配置:

<bean id="courseDao" class="com.qcjy.learning.Dao.impl.CourseDaoImpl"></bean>

那么通过这样配置,Spring是怎么帮我们实例化对象,并且放到容器中去了了?对,就是通过反射!!!

面试:Java反射在动态代理中的应用

JDK动态代理

Java动态代理类位于Java.lang.reflect包下,一般主要涉及到以下两个类:

  1. Interface InvocationHandler:该接口中仅定义了一个方法Object,invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组。这个抽象方法在代理类中动态实现。
  2. Proxy:该类即为动态代理类。

Cglib动态代理

JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理。JDK代理要求被代理的类必须实现接口,有很强的局限性。而CGLIB动态代理则没有此类强制性要求。简单的说,CGLIB会让生成的代理类继承被代理类,并在代理类中对代理方法进行强化处理(前置处理、后置处理等)。在CGLIB底层,其实是借助了ASM这个非常强大的Java字节码生成框架。

Javassist代理

一种是使用代理工厂创建,另一种通过使用动态代码创建。使用代理工厂创建时,方法与CGLIB类似,也需要实现一个用于代理逻辑处理的Handler;使用动态代码创建,生成字节码,这种方式可以非常灵活,甚至可以在运行时生成业务逻辑。

本文分享自微信公众号 - 转行程序员(be_coder),作者:转行程序员

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 转行程序员能干嘛?

    2. 可以做一个自由职业开发者,做个网站,开发个app,能不能捞金就看个人了,反正B是装完了。

    王炸
  • 一个月真的可以学会一门语言吗?

    知乎上总看到有人提这个问题, 我想转行,我要学多久才能学会,分享下我到经历,以便你评估一下自身来不来得及,别人是没办法帮你评估的。

    王炸
  • 快速学好一门编程语言

    关于如何学习一门编程语言的问题,新人总是会问,我能学会吗?我适合学编程吗,我的智商够吗?我通常会反问你觉得学英语难吗?我想说的是,其实学一门编程语言和学一门外语...

    王炸
  • 微信、美团的APP“404页面”居然是这样的

    大多数App都要与服务器进行数据的交换,App向服务器发出数据请求,服务器接收到请求之后向App传输相应数据,App接收成功后显示数据内容,没有接收成功则反馈数...

    BestSDK
  • 历史上消失的那 10 天去哪了?

    Linux上有个cal命令可以查日历,如果你查过1752年,可能会奇怪,为什么9月2号后面是14号,却是丢失了11天!

    苏生不惑
  • Oracle:相信我,Java 仍然是免费的!

    撇开科技巨头们间的暗流涌动,开发者们切身使用到的编程工具层面,同样上演着各式风云。

    纯洁的微笑
  • 【译】有趣的加载动画

    一个app或者网站能够即时响应是最好的,但总会有受限于速度的时候。一次差的网络连接,一个较长的操作都有可能导致一个响应缓慢。对于这些情况,设计师必须告知用户ap...

    Shawn.W
  • 23.python map函数

    截至到目前为止,其实我们已经接触了不少的python内置函数,而map函数也是其中之一,map函数是根据指定函数对指定序列做映射,在开发中使用map函数也是有效...

    猿说编程[Python和C]
  • Lottie动画简介

    照着GIF图/效果视频去模仿,猜测动画时长,手动创建贝塞尔曲线……反复调整参数,一遍遍目测效果,最后发现:

    ayqy贾杰
  • 实用简介:MQTT协议及其在物联网中的应用

    MQTT (Message Queuing Telemetry Transport,消息队列遥测传输) 是一种标准化的发布/订阅消息传输协议,设计于1999年,...

    CSDN技术头条

扫码关注云+社区

领取腾讯云代金券