java中的动态代理Proxy

  1. 创建一个 UserService 接口
public interface UserService {
    UserService login();
}
  1. 写一个 UserService 接口的具体实现类 UserServiceImpl
public class UserServiceImpl implements UserService {
    @Override
    public UserService login() {
        System.out.println("登录成功");
        return this;
    }
}
  1. 写一个代理类 UserProxy ,这里 实现了 InvocationHandler 接口
    创始一个使用jdk的proxy完成动态代理工具类
public class UserProxy implements InvocationHandler {
    private Object object;

    public UserProxy() {
    }

    public JdkProxy(Object object) {
        this.object = object;
    }
   //创建代理对象
    public Object createProxy() {
        // 使用Proxy完成代理对象创建
        // 1.得到目标对象的ClassLoader
        ClassLoader loader = target.getClass().getClassLoader();
        // 2.得到目标对象的实现接口的Class[]
        Class[] interfaces = target.getClass().getInterfaces();
        // 3.第三个参数需要一个实现了InvocationHandler接口的对象
        return Proxy.newProxyInstance(loader, interfaces, this);
    }

    // 在代理实例上处理方法调用并返回结果。
    // 参数1 就是代理对象,一般不使用
    // 参数2它调用的方法的Method对象
    // 参数3调用的方法的参数
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // 功能增强操作
        System.out.println("登录前的其他操作....");
        method.invoke(object, args);
        //返回一个代理对象
        return proxy;
    }
}
  1. 编写一个测试类 TestUserProxy
public class TestProxy {
    @Test
    public void test1() {
        // 1.创建目标对象
        UserService userService = new UserServiceImpl();
        // 2.通过UserProxy完成代理对象创建
        UserProxy userProxy = new UserProxy(userService);
        UserService proxy = (UserService) userProxy.createProxy();
        proxy.login().login();
    }
}

你可能感兴趣的:(java中的动态代理Proxy)