问题一:什么是反射?
反射主要是指程序可以访问、检测和修改它本事状态或行为的一种能力。
在Java反射中,可以知道任意一个类有哪些属性,哪些方法,可以调用它的任意一个方法 ;
Java反射机制主要提供以下几个功能:
- 在运行时判断任意一个对象所属的类;
- 在运行时构造任意一个类的对象;
- 在运行时判断任意一个类具有的成员变量和方法;
- 在运行时调用任意一个对象的方法。
问题二:什么是Java序列化?什么情况下需要序列化?
为了保存对象在内存中的状态,并且可以把保存的对象再读出来;
序列化:将Java对象转换成字节流的过程;
反序列化:将字节流转换成Java对象的过程;
什么情况需要序列化:
当Java对象需要在网络上传输或者持久化存储的时候。
问题三:动态代理是什么?有哪些应用?
动态代理:
当你要实现某个接口的类中的方法,加一些额外的处理。比如加日志、事务等。就可以创建一个代理类,这个类包含原来的基础之上又添加了额外的功能。这个代理类不是定义好的,而是动态生成的。既有解耦意义,扩展性强。
应用:Spring的AOP,加事务,加权限,加日志。
问题四:怎么实现动态代理?
在java.lang.reflect包下提供了一个Proxy和InvocationHandler接口,通过这个类和接口可以生成动态代理类和动态代理对象。
- 先定义一个接口,还要有一个InvocationHandler处理类(将实现接口的类的对象传递给他)。
- 再有一个工具类Proxy,也叫代理类,调用newInstance()方法产生代理对象,其实Proxy只是一个产生代理对象的工具类。
- 利用InvacationHandler,拼接代理类源码,将其编译生成代理类的二进制码,利用类加载器加载,并将其实例化产生代理对象,最后返回。
//创建一个与代理对象相关联的InvocationHandler
InvocationHandler stuHandler = new MyInvocationHandler<Person>(stu);
//创建一个代理对象stuProxy,代理对象的每个执行方法都会替换执行Invocation中的invoke方法
Person stuProxy= (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[]{Person.class}, stuHandler);