Java 反射 --2021 面试题系列教程(附答案解析)-- 大白话解读 --JavaPub 版本
前言
序言
再高大上的框架,也需要扎实的基础才能玩转,高频面试问题更是基础中的高频实战要点。
适合阅读人群
Java 学习者和爱好者,有一定工作经验的技术人,准面试官等。
阅读建议
本教程是系列教程,包含 Java 基础,JVM,容器,多线程,反射,异常,网络,对象拷贝,JavaWeb,设计模式,Spring-Spring MVC,Spring Boot / Spring Cloud,Mybatis / Hibernate,Kafka,RocketMQ,Zookeeper,MySQL,Redis,Elasticsearch,Lucene。订阅不迷路,2021 奥利给。
微信搜:JavaPub,阅读全套系列面试题教程
[toc]
题目
前言
1.什么是反射?
百度百科:
Java 的反射(reflection)机制是指在程序的运行状态中,可以构造任意一个类的对象,可以了解任意一个对象所属的类,可以了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和方法。这种动态获取程序信息以及动态调用对象的功能称为 Java 语言的反射机制。反射被视为动态语言的关键。
在 Java 运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法
Java 反射机制主要提供了以下功能:
在运行时判断任意一个对象所属的类。
在运行时构造任意一个类的对象。
在运行时判断任意一个类所具有的成员变量和方法。
在运行时调用任意一个对象的方法。
JavaPub 参考巨人:https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html
到这里如果你对 Java 反射还有一些疑惑,后面再 JavaPub 公众号,还回做更详细的讲解。
2.什么是 java 序列化?什么情况下需要序列化?
序列化和反序列化是 Java 中最基础的知识点,也是很容易被大家遗忘的,虽然天天使用它,但并不一定都能清楚的说明白。我相信很多小伙伴们掌握的也就几句概念、关键字(Serializable)而已,如果深究问一下序列化和反序列化是如何实现、使用场景等,就可能不知所措了。在每次我作为面试官,考察 Java 基础时,通常都会问到序列化、反序列化的知识点,用以衡量其 Java 基础如何。当被问及 Java 序列化是什么?反序列化是什么?什么场景下会用到?如果不用它,会出现什么问题等,一般大家回答也就是几句简单的概念而已,有的工作好几年的应聘者甚至连概念都说不清楚,一脸闷逼。
什么是序列化和反序列化
简单说就是为了保存在内存中的各种对象的状态(也就是实例变量,不是方法),并且可以把保存的对象状态再读出来。虽然你可以用你自己的各种各样的方法来保存 object states,但是 Java 给你提供一种应该比你自己好的保存对象状态的机制,那就是序列化。
什么情况下需要序列化
当你想把的内存中的对象状态保存到一个文件中或者数据库中时候;
当你想用套接字在网络上传送对象的时候;
当你想通过 RMI 传输对象的时候;
为什么需要使用序列化和反序列化
我们知道,不同进程/程序间进行远程通信时,可以相互发送各种类型的数据,包括文本、图片、音频、视频等,而这些数据都会以二进制序列的形式在网络上传送。
那么当两个 Java 进程进行通信时,能否实现进程间的对象传送呢?当然是可以的!如何做到呢?这就需要使用 Java 序列化与反序列化了。发送方需要把这个 Java 对象转换为字节序列,然后在网络上传输,接收方则需要将字节序列中恢复出 Java 对象。
我们清楚了为什么需要使用 Java 序列化和反序列化后,我们很自然地会想到 Java 序列化有哪些好处:
实现了数据的持久化,通过序列化可以把数据永久地保存到硬盘上(如:存储在文件里),实现永久保存对象。
利用序列化实现远程通信,即:能够在网络上传输对象。
JavaPub 参考巨人:https://xcbeyond.blog.csdn.net/article/details/100046212
3.动态代理是什么?有哪些应用?
动态代理:在运行时,创建目标类,可以调用和扩展目标类的方法。
Java 中实现动态的方式:JDK 中的动态代理 和 Java 类库 CGLib。
应用场景如:
统计每个 api 的请求耗时
统一的日志输出
校验被调用的 api 是否已经登录和权限鉴定
Spring 的 AOP 功能模块就是采用动态代理的机制来实现切面编程
JavaPub 参考巨人:https://www.cnblogs.com/aheizi/p/4861422.html
4.怎么实现动态代理?
Java 领域中,常用的动态代理实现方式有两种,一种是利用 JDK 反射机制生成代理,另外一种是使用 CGLIB 代理。
JDK 代理必须要提供接口,而 CGLIB 则不需要,可以直接代理类。下面分别举例说明。
1.JDK 动态代理:
2.CGLIB 动态代理
需要引入CGLIB相关Jar包
JavaPub 参考巨人:https://www.cnblogs.com/xifengxiaoma/p/9377261.html
如何使用 Java 的反射?
通过一个全限类名创建一个对象
Class.forName(“全限类名”); 例如:com.mysql.jdbc.Driver Driver 类已经被加载到 jvm 中,并且完成了类的初始化工作就行了
类名.class; 获取 Class<?> clz 对象
对象.getClass();
获取构造器对象,通过构造器 new 出一个对象
Clazz.getConstructor([String.class]);
Con.newInstance([参数]);
通过 class 对象创建一个实例对象(就相当与 new 类名()无参构造器)
Cls.newInstance();
通过 class 对象获得一个属性对象
Field c=cls.getFields():获得某个类的所有的公共(public)的字段,包括父类中的字段。
Field c=cls.getDeclaredFields():获得某个类的所有声明的字段,即包括 public、private 和 proteced,但是不包括父类的声明字段
通过 class 对象获得一个方法对象
Cls.getMethod(“方法名”,class……parameaType);(只能获取公共的)
Cls.getDeclareMethod(“方法名”);(获取任意修饰的方法,不能执行私有)
M.setAccessible(true);(让私有的方法可以执行)
让方法执行
Method.invoke(obj 实例对象,obj 可变参数);-----(是有返回值的)
2021 面试题,认准 JavaPub。
版权声明: 本文为 InfoQ 作者【JavaPub】的原创文章。
原文链接:【http://xie.infoq.cn/article/bf1b4a2e1c525b86bd3175338】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论