JDK动态代理

来源:互联网 发布:芝加哥人均收入知乎 编辑:程序博客网 时间:2024/06/15 03:34

动态代理主要用来做方法的增强,在不修改源码的情况下,在调用方法执行的前后做你想做的事情,比如添加日志记录、事务控制等。

特点:

通过实现InvocationHandler接口创建自己的调用处理器;

通过为Proxy类执行ClassLoader对象和一组interface来创建动态代理类;

通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;

通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入;


接口和实现类:

public interface IHello {public String sayHello(String name);}

public class HelloImpl implements IHello{public String sayHello(String name){System.out.println("--say hello to "+name);return "hello "+name;}}


使用Proxy实现动态代理:

public class TestProxy {@Testpublic void testProxy(){final IHello hello=new HelloImpl();IHello proxyHello=(IHello) Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(), new Class[] { IHello.class }, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("--before say hello.");Object object = method.invoke(hello, args);System.out.println("--after say hello.");return object;}});String name="jack";String result=proxyHello.sayHello(name);System.out.println(result);}}


测试运行一下:



使用动态代理类,在调用IHello接口中sayHello()方法的前后,增加了打印输出,实现了非侵入式的设计。


0 0