java动态代理
java的动态代理,是要基于接口实现的。
定义一个接口Dongwu
/** * <p>@ClassName: Dongwu</p> * <p>Description: 动物接口</p> */ public interface Dongwu { //定义动物两个方法 public void chi(); public void jiao(); }
定义Dog类实现Dongwu接口
public class Dog implements Dongwu { @Override public void chi() { System.out.println("狗在吃骨头。。。。。。"); } @Override public void jiao() { System.out.println("狗在旺旺的叫。。。。。"); } }
定义一个代理处理器。该处理其是关键,可以控制代理对象实现,自己给代理对象调用方法过程中的业务逻辑。
public class ProxyHandler implements InvocationHandler { private Object object; public ProxyHandler(Object object){ this.object = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("方法调用之前。。。。。"); if("jiao".equals(method.getName())){ System.out.println("代理狗在旺旺的叫。。。。。。。"); }else{ method.invoke(object, args); } System.out.println("方法调用之后。。。。。"); return null; } }
最后测试动态代理过程:
/** * <p>@ClassName: ProxyTest01</p> * <p>Description: java动态代理测试</p> */ public class ProxyTest01 { @Test public void test1(){ /* * 在java中对象new出来后,他的属性方法,就已经固定: * public void chi() { System.out.println("狗在吃骨头。。。。。。");} public void jiao() { System.out.println("狗在旺旺的叫。。。。。");} * */ Dog dog = new Dog(); //如果此时在某次方法的调用中改变dog中jiao()的输出语句,可以使用dog的代理对象,即代理狗 ProxyHandler h = new ProxyHandler(dog); //生产出代理狗proxydog Dongwu proxydog = (Dongwu) Proxy.newProxyInstance(dog.getClass().getClassLoader(), dog.getClass().getInterfaces(), h); proxydog.chi(); proxydog.jiao(); } }
输出结果:


浙公网安备 33010602011771号