一 动态代理
动态代理是指客户通过代理类来调用其它对象的方法,并且是在程序运行时根据需要动态创建目标类的代理对象,下面直接看代码:
二 测试
Animal.java
package com.lxj.dynamic.proxy; public interface Animal { public void action(); public void breath(); }
Cat.java
package com.lxj.dynamic.proxy; //被代理类Cat public class Cat implements Animal { @Override public void action() { System.out.println("喵喵喵~~~~"); } @Override public void breath() { System.out.println("猫式呼吸法~~~~"); } }
Dog.java
package com.lxj.dynamic.proxy; //被代理类 Dog public class Dog implements Animal { @Override public void action() { System.out.println("汪汪汪~~~~~"); } @Override public void breath() { System.out.println("狗式呼吸法~~~~"); } }
MyProxy.java
package com.lxj.dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; //代理类MyProxy,动态代理需要实现InvocationHandler接口 public class MyProxy implements InvocationHandler{ Object obj; public MyProxy() {} public void setObj(Object obj) { this.obj = obj; } //代理类调用方法时,都会调用invoke方法 //method:代理对象执行的方法 //args:参数 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("==============代理类开始执行!!!!============="); //returnVal是方法的返回值 Object returnVal = method.invoke(obj, args); System.out.println("==============代理类执行结束!!!!============="); return returnVal; } }
ProxyUtil.java
package com.lxj.dynamic.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class ProxyUtil { public static Object getProxyInstance(Object obj) { MyProxy proxy = new MyProxy(); proxy.setObj(obj); /* * obj.getClass().getClassLoader():被代理对象的类加载器 * obj.getClass().getInterfaces() :被代理对象的接口 * 实质上是通过反射将被代理类的加载器和接口与代理对象关联起来 * obj :是被代理的对象 * proxy:实现InvocationHandler的接口 */ return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), proxy); } }
TestDynamicProxy.java
package com.lxj.dynamic.proxy; public class TestDynamicProxy { public static void main(String[] args) { Cat cat = new Cat(); Object proxyInstance = ProxyUtil.getProxyInstance(cat); Animal animal = (Animal) proxyInstance; animal.action(); animal.breath(); Dog dog = new Dog(); proxyInstance = ProxyUtil.getProxyInstance(dog); animal = (Animal) proxyInstance; animal.action(); animal.breath(); } }
三 运行结果
动态代理的代理对象是在运行时动态创建目标类的代理对象,而静态代理是需要为每个目标类创建代理对象,动态代理只需要一个方法就可以,相比静态代理代码冗余量减少了。