java动态代理的简单实现

以下是针对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);

}
             

猜你喜欢

转载自blog.csdn.net/lyitit/article/details/80804373