面试知识点四:反射
57.什么是反射?
58.什么是 java 序列化?什么情况下需要序列化?
59.动态代理是什么?有哪些应用?
60.怎么实现动态代理?
57.什么是反射?
反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
58.什么是 java 序列化?什么情况下需要序列化?serialVersionUID有什么作用?
Java对象序列化是一个用于将对象状态转换为字节流的过程,可以将其保存到磁盘文件中或通过网络发送到任何其他程序;从字节流创建对象的相反的过程称为反序列化。而创建的字节流是与平台无关的,在一个平台上序列化的对象可以在不同的平台上反序列化。
对象的序列化技术在EJB3.0中得到广泛的使用,分布式的架构,远程方法调用,那肯定要用到对象序列化;
客户端通过JNDI查找到某一个EJB,那么你调了该企业Bean的方法,传近去的这个参数是需要序列化的,该方法的返回值,也是要序列化传过来的;
显式地定义serialVersionUID有两种用途:
1)在某些场合,希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有相同的serialVersionUID;在某些场合,不希望类的不同版本对序列化兼容,因此需要确保类的不同版本具有不同的serialVersionUID。
2)当你序列化了一个类实例后,希望更改一个字段或添加一个字段,不设置serialVersionUID,所做的任何更改都将导致无法反序化旧有实例,并在反序列化时抛出一个异常。如果你添加了serialVersionUID,在反序列旧有实例时,新添加或更改的字段值将设为初始化值(对象为null,基本类型为相应的初始默认值),字段被删除将不设置。
59.动态代理是什么?有哪些应用?
动态代理是一种运行时动态创建代理对象、动态处理代理对象方法调用的机制,很多场景都是利用类似机制做到的,比如用来包装RPC调用、面向切面的编程(AOP)。
60.怎么实现动态代理?
先通过Proxy类的newProxyInstance获取代理对象,然后基于该代理对象的方法调用会触发与该代理对象关联的invocation handler中的invoke方法。invoke方法中会发起对真实对象方法的调用,以及一些别的操作。