动态代理
1.只有一个方法
Object proxyObject = Proxy.newProxyInstance(ClassLoader,Class[],ivokationHandler);
ClassLoader ->类加载器
它是用来加载类,把.class加载到内存中,形成class对象。
创建对象的过程:
1.加载类
{
加载.class到内存的方法区 ->要依赖classloader
执行静态代码块和初始化语句
}
2.执行new 差UN跟腱炎hi个空白对象
3.调用构造器,
4.子类调用父类构造器,
5.构造其执行过程()
{
执行构造代码块和初始化语句
构造器内容
}
Class[] ->Interfaces一组要实现的接口
ivokationHandler ->调用处理器
注:ivokationHandler 是一个接口
所以需要new一个对象,内部类实现唯一的方法invoke(Object proxy ,Method method, Object[] args)返回值Object。
这个方法在调用代理对象所实现接口的方法时会被调用。
调用方法时,
proxy是代理对象
->当前对象(a传递给proxy),
-> method是当前被调用的方法,即目标方法(aaa传递给method),
->args实参(参数传给args)
增强内容就是在invoke中
invoke返回值对应对象toString返回的值
常规思路
新建一个类实现ivokationHandler接口,有一个成员变量,变量是被增强的对象,invoke方法中调用这个对象需要被增强的方法,在此基础之上进行增强。
之后通过newProxyInstance获得被增强后的对象,调用方法即可。
动态创建实现了所有指定接口的对象
这个对象实现的所有接口中的方法
内容都是调用invokationHandler中的invoke方法
这个对象甚至执行object本身的方法,也会去调用invoke方法
****注意,没有加native的方法不会执行invoke
针对动态代理的理解
在运行时,动态实现一组指定接口的实现类对象
即 在运行的时候,创建(实现了一组指定接口的)对象
动态代理的作用
最终是学习AOP ->面向切面编成->与装饰者模式有点类似,但是比装饰者模式还要灵活。
补充:OOP的含义,面向对象编成