动态代理:Proxy、InvocationHandler

318 阅读1分钟

通过一个例子简单实现动态代理:给增删改查操作增加日志功能

(1)创建增删改查操作的接口

public interface IFunction {
    void select();
    void insert();
    void update();
    void delete();
}

(2)创建增删改查操作的实现类


public class Function implements IFunction{

    @Override
    public void select() {
        running("select");
    }

    @Override
    public void insert() {
        running("insert");
    }

    @Override
    public void update() {
        running("update");
    }

    @Override
    public void delete() {
        running("delete");
    }

    private void running(String doWhat){
        System.out.println(doWhat + "is running");
    }
}

(3)创建InvocationHandler实现类

public class CreateHandler implements InvocationHandler {

    private IFunction iFunction;

    public CreateHandler(IFunction iFunction){
        this.iFunction = iFunction;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("操作开始运行,操作类型是:"+method.getName());
        Object res = method.invoke(iFunction, args);
        System.out.println(method.getName()+"运行结束");
        System.out.println();
        return res;
    }
}

(4)Service类调用增删改查操作

public class Service {
    public static void main(String[] args) {
        CreateHandler handler = new CreateHandler(new Function());
        IFunction o = (IFunction)Proxy.newProxyInstance(handler.getClass().getClassLoader(),Function.class.getInterfaces(),handler);
        
        o.insert();
        o.select();
        o.update();
        o.delete();
    }
}

输出结果:

操作开始运行,操作类型是:insert
insertis running
insert运行结束

操作开始运行,操作类型是:select
selectis running
select运行结束

操作开始运行,操作类型是:update
updateis running
update运行结束

操作开始运行,操作类型是:delete
deleteis running
delete运行结束

注意:被代理对象必须实现接口

newProxyInstance()方法包括三个参数:

(1)ClassLoader:类加载器(随便哪个类的类加载器都行。。。本质上是一样的)
IFunction.class.getClassLoader();
Function.class.getClassLoader();
CreateHandler.class.getClassLoader();
//类加载器都是AppClassLoader
(2)Class<?>[]:被代理对象实现的接口

(3)InvocationHandler:InvocationHandler的实现类