代理模式:
1.代理模式角色:
1) 被代理者。
2) 代理者。继承同一个父接口。
2.代理的作用:
1) 为已经存在一的多个具有相同的接口的目标顺的方法增加一些相同的功能。
2) 代理类是使用反射在JVM运行时动态产生的,所以其使用有很好的灵活性,可以在任何业务逻辑之前和之后加入自己想加入的代码。
3.代理的原理:
4.jdk中动态代理实现
java的动态代理要求去实现一个InvocationHandlerv接口。而在它的实现类中只要去实现一个方法。
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { start(); Object o = method.invoke(obj,args); end(); return o; }
第一个参数proxy,表示代理类,第二个方法则是表示,被代理类的需要调用的方法。每三个参数被调用的方法中传入的参数。
然后通过Method中的invoke(obj,args)去反射调用方法。
在这个方法之前就可以去增加各种功能。从而实现动态代理功能。
5.动态代理的创建:
1)直接通过Prxoy实例化:
Person person = new Person(); MyProxy myProxy = new MyProxy(person); Human personProxy = (Human) Proxy.newProxyInstance( Person.class.getClassLoader(), Person.class.getInterfaces(), myProxy); // 以下代码则会报错。 // Person personProxy = // (Person)Proxy.newProxyInstance(Person.class.getClassLoader(),Person.class.getInterfaces(), // myProxy); personProxy.save();
直接通过Proxy的实例化得到代理对象 ,然后调用方法。
2)通过获得代理类的字节码,然后得到构造方法,传入InvocationHandlerv.class获得代理类。实现动态代理。
Person person = new Person(); MyProxy myProxy = new MyProxy(person); Class<?> clazzProxy = Proxy.getProxyClass(Person.class.getClassLoader(), Person.class.getInterfaces()); Constructor<?> constructor = clazzProxy.getConstructor(InvocationHandler.class); //Constructor<?> constructor = clazzProxy.getConstructor(MyProxy.class); //必须要用InvocationHandler用它的实现类是不可以的! Human personPrxoy = (Human)constructor.newInstance(myProxy); personPrxoy.save();