以下是针对java原生API动态代理的两种简单实现。笔者下一篇是介绍cglib的动态代理,可以参照《cglib动态代理的实现》
公共接口如下:
public interface IHello { String sayHello(String name); }
实现如下:
public class IHelloImpl implements IHello { @Override public String sayHello(String name) { return "hello "+name; } }
1.只有接口,没有实现类的代理
/** * 备注:单独对接口的InvocationHandler */ public class IHelloInvocationHandler implements InvocationHandler { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { return "hello";//返回值 } }
/** * 备注: 只有接口,没有实现类的代理 */ @Test public void test01() { IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(), new Class[]{IHello.class}, new IHelloInvocationHandler()); String rn = iHello.sayHello("test"); System.out.println("返回值 --->>>" + rn); }
2.对接口实现类的代理
/** * 备注:对接口实现类的InvocationHandler */ public class IHelloImplInvocationHandler implements InvocationHandler { //被代理对象 private Object obj; //被代理对象通过构造方法传入 public IHelloImplInvocationHandler(Object obj) { this.obj = obj; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("方法执行前--->>>"); Object invoke = method.invoke(obj, args); System.out.println("方法执行后--->>>"); return invoke;//返回值 } }
/** * 备注:对接口实现类的代理 */ @Test public void test02() { IHello iHelloImpl = new IHelloImpl(); IHello iHello = (IHello) Proxy.newProxyInstance(IHello.class.getClassLoader(), new Class[]{IHello.class}, new IHelloImplInvocationHandler(iHelloImpl)); String rn = iHello.sayHello("test"); System.out.println("返回值 --->>>" + rn); }