Java动态代理实现代码

128 阅读1分钟

UserService接口

public interface UserService {
    public  void add();
    public  void del();
    public  void update();
    public  void query();
}

UserServiceImpl类实现UserService接口

public class UserServiceImpl implements UserService{

    @Override
    public void add() {
        System.out.println("add");
    }

    @Override
    public void del() {
        System.out.println("del");
    }

    @Override
    public void update() {
        System.out.println("update");
    }

    @Override
    public void query() {
        System.out.println("query");
    }
}

调用处理程序,使用它的getProxy()方法可以动态代理target

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class ProxyInvocationHandler implements InvocationHandler {
    //被代理的接口
    private Object target;
    public void setTarget(Object target) {
        this.target = target;
    }
    //得到代理类
    public Object getProxy() {
        Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxy;
    }
    
    //处理代理类实例,并返回结果
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        Object res = method.invoke(target, args);
        return res;
    }
}

测试类Client:动态生成UserService接口的代理类

import com.mqb.UserService;
import com.mqb.UserServiceImpl;
public class Client {
    public static void main(String[] args) {
        UserServiceImpl userService = new UserServiceImpl();
        ProxyInvocationHandler invo = new ProxyInvocationHandler();
        invo.setTarget(userService);
        UserService proxy = (UserService) invo.getProxy();
        proxy.add();
        proxy.del();
        proxy.update();
        proxy.query();
    }
}

运行测试程序

add
del
update
query

当调用方法时,自动输出方法名 需要在调用处理程序中添加方法,之后再invoke()方法中去调用即可

package com.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ProxyInvocationHandler implements InvocationHandler {
    private Object target;

    public void setTarget(Object target) {
        this.target = target;
    }

    public Object getProxy() {
        Object proxy = Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
        return proxy;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        //在这里添加新添加的log()方法
        log(method.getName());


        Object res = method.invoke(target, args);

        return res;
    }
//新添加的方法
    public void log(String method){
        System.out.println("调用了"+method+"方法");
    }
}

接着再运行测试类,输出如下结果

调用了add方法
add
调用了del方法
del
调用了update方法
update
调用了query方法
query