java中对于对象的增强有三种手段:
* 继承
被增强的对象固定的
增强的内容也是固定的
* 装饰者模式
被增强的对象是可以切换的
增强的内容是固定的
* 动态代理(AOP)
被增强的对象可以切换:Service
增强的内容也可以切换:事务处理
今天刚好看了下动态代理,也就写写简单的一些知识。
1.动态代理的用处
对于动态处理如果我们不想自己写个框架,那么基本上是用上不动态代理技术的,但是它可以让我们更好的理解框架内部的原理,为了学习框架打下基础。
2.运行时实现指定的接口
想实现某个接口,你需要写一个类,然后在类名字的后面给出“implements”XXX接口。这才是实现某个接口:
public interface MyInterface {
void fun1();
void fun2();
}
public class MyInterfaceImpl implements MyInterface {
public void fun1() {
System.out.println("fun1()");
}
public void fun2() {
System.out.println("fun2()");
}
}
Class[] cs = {MyInterface.class};
MyInterface mi = (MyInterface)Proxy.newProxyInstance(loader, cs, h);
3.newProxyInstance()的参数
Proxy类的newInstance()方法有三个参数:
·ClassLoader loader:它是类加载器类型,只要你有一个Class对象就可以获取到ClassLoader对象;
· Class[] interfaces:指定newProxyInstance()方法返回的对象要实现哪些接口,并且可以指定多个接口,例如上面例子只我们只指定了一个接口:Class[] cs = {MyInterface.class};
·InvocationHandler h:它是最重要的一个参数!它是一个接口!它的名字叫调用处理器!其实无论你调用代理对象的什么方法,它都是在调用InvocationHandler的invoke()方法。4.InvocationHandle的invoke()方法的参数
·Object proxy:代理对象,也就是Proxy.newProxyInstance()方法返回的对象,通常我们用不上它;
· Method method:表示当前被调用方法的反射对象,例如mi.fun1(),那么method就是fun1()方法的反射对象;
· Object[] args:表示当前被调用方法的参数,当然mi.fun1()这个调用是没有参数的,所以args是一个零长数组。
因篇幅问题不能全部显示,请点此查看更多更全内容