程序员

经典Java面试题的答案——反射

2020-11-17  本文已影响0人  九神说编程

大家好,我是九神。这是互联网技术岗的分享专题,废话少说,进入正题:

57.什么是反射?

反射主要是指程序可以访问、检测和修改它本身状态或行为的一种能力

Java反射:在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法

Java反射机制主要提供了以下功能:

Java Reflection API简介

在JDK中,主要由以下类来实现Java反射机制,这些类(除了第一个)都位于java.lang.reflect包中

58.什么是 java 序列化?什么情况下需要序列化?

序列化:将对象写入到IO流中。

意义:序列化机制允许将实现序列化的Java对象转换位字节序列,这些字节序列可以保存在磁盘上,或通过网络传输,以达到以后恢复成原来的对象。序列化机制使得对象可以脱离程序的运行而独立存在。

什么情况下需要序列化:

如何序列化:

如果需要将某个对象保存到磁盘上或者通过网络传输,那么这个类应该实现Serializable接口或者Externalizable接口之一。

59.动态代理是什么?有哪些应用?

酱油君批:59和60题建议先了解代理的设计模式~同时自己动手做Demo,面试中我们经常会深入实际问。

动态代理:当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

动态代理的应用:Spring AOP、Hibernate数据查询、测试框架的后端mock、RPC远程调用、Java注解对象获取、日志、用户鉴权、全局性异常处理、性能监控,甚至事务处理等。

60.怎么实现动态代理?

Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理。

通过实现接口的方式 -> JDK动态代理。

通过继承类的方式 -> CGLIB动态代理。

JDK动态代理:

JDK动态代理主要涉及两个类:java.lang.reflect.Proxyjava.lang.reflect.InvocationHandler

JDK动态代理的实现:

CGLIB动态代理:

CGLib采用底层的字节码技术,全称是:Code Generation Library,CGLib可以为一个类创建一个子类,在子类中采用方法拦截的技术拦截所有父类方法的调用并顺势织入横切逻辑。

两者性能对比:

1、CGLib所创建的动态代理对象在实际运行时候的性能要比JDK动态代理高不少,有研究表明,大概要高10倍;

2、但是CGLib在创建对象的时候所花费的时间却比JDK动态代理要多很多,有研究表明,大概有8倍的差距;

3、因此,对于singleton的代理对象或者具有实例池的代理,因为无需频繁的创建代理对象,所以比较适合采用CGLib动态代理,反之,则比较适用JDK动态代理。

文章转载自:
经典Java面试题的答案——反射

上一篇 下一篇

猜你喜欢

热点阅读