42. 什么是反射?反射的应用场景?
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。
反射 (Reflection) 是 Java 的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。
反射最重要的用途就是开发各种通用框架.Spring的bean管理就是反射。
43. 什么是 java 序列化?什么情况下需要序列化?
序列化简单来说就保存对象在内存中的状态也可以说是实例化变量。这是Java提供的用来保存 Object state,一种保存对象状态的机制。只有实现了serializable接口的类的对象才能被实例化。
序列化的用途有,当你想把内存中的对象写入到硬盘时,当你想用套接字在网络上传输对象时,当你想通过远程调用对象,在一个jvm上调用另一个jvm的对象时。
当序列化需要注意的事项有,序列化只保存对象的状态,而不管对象的方法。 当一个父类实现了序列化,它的子类也自动实现序列化,不用显示进行实现了。 当一个实例对象引用其他对象,当序列化该对象时也把引用的对象进行了实例化。
serializable接口就是Java提供用来进行高效率的异地共享实例对象的机制,实现这个接口即可
44. 动态代理是什么?有哪些应用?
动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作(也可以对原方法的参数进行操作)。动态代理的应用有,Spring的AOP加事务加权限加日志
45. 怎么创建动态代理以及区别?
基于接口的动态代理:使用JDK官方的Proxy类创建代理对象,需要注意代理的目标对象必须实现接口(至少一个)
基于类的动态代理:使用第三方CGLib的Enhancer类创建代理对象,需要注意被代理类不能用 final 修饰的类(最终类)。如果报 asmxxxx 异常,需要导入 asm.jar包
总结:无论哪种代理方式,都需要创建一个被代理的类(实例)。不管是基于接口的代理,还是基于子类的代理,均拦截被代理对象的所有方法,然后我们可以对这些方法进行增强或者其他一些操作。