hooyantsing's Blog

代理_Proxy

字数统计: 799阅读时长: 3 min
2020/05/29

代理

代理 Proxy


**参考:

**

https://www.jianshu.com/p/8ccdbe00ff06

Java代理(Proxy)模式 - 简书

三种代理

  • 静态代理
  • JDK动态代理
  • Cglib代理

理解代理

被代理的对象称之为目标对象。

通过代理模式生成的对象称之为代理对象。它并没有真身(在硬盘上对应的.class文件),而是生成的一个对象并直接存于内存当中。

它可以在目标对象所提供的功能基础上额外提供一些逻辑或功能。

Proxy类,参数:

  1. 加载器(获取代码固定的:
  2. 目标对象
  3. 处理器(

a00429b385c45003926e26fe29c8d56b.png

JDK动态代理

AdminService.java

定义接口。

1
2
3
4
5
6
package proxy.jdk;

public interface AdminService {
    void update();
    Object find();
}

AdminServiceImpl.java

实现接口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package proxy.jdk;

public class AdminServiceImpl implements AdminService {
    @Override
    public void update() {
        System.out.println("修改管理系统数据");
    }

    @Override
    public Object find() {
        System.out.println("查看管理系统数据");
        return new Object();
    }
}

AdminServiceInvocation.java

处理器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package proxy.jdk;

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

/**
* 处理器 继承InvocationHandler接口
*/
public class AdminServiceInvocation implements InvocationHandler {

    private Object target;

    public AdminServiceInvocation(Object target){
        this.target = target;
    }

    //代理对象增加的逻辑代码
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("判断用户是否有权限进行操作");
        Object obj = method.invoke(target);
        System.out.println("记录用户执行操作的用户信息、更改内容和时间等");
        return obj;
    }
}

AdminServiceDynamicProxy.java

动态代理类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package proxy.jdk;

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

/**
* 动态代理类
*/
public class AdminServiceDynamicProxy {
    private Object target;
    private InvocationHandler invocationHandler;

    public AdminServiceDynamicProxy(Object target, InvocationHandler invocationHandler) {
        this.target = target;
        this.invocationHandler = invocationHandler;
    }

    //获取代理对象
    public Object getPersonProxy(){
        Object obj = Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),invocationHandler);
        return obj;
    }
}

DynamicProxyTest.java

测试类。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
package proxy.jdk;

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

public class DynamicProxyTest {
    public static void main(String[] args) {

        /*方法一*/
        System.out.println("============ 方法一 ==============");
        //接口声明  引用实现类
        AdminService adminService = new AdminServiceImpl();
        System.out.println("代理的目标对象:" + adminService.getClass());
        //获取处理器 把目标对象放进去
        AdminServiceInvocation adminServiceInvocation = new AdminServiceInvocation(adminService);
        //获取代理对象
        AdminService proxy = (AdminService) new AdminServiceDynamicProxy(adminService,adminServiceInvocation).getPersonProxy();
        System.out.println("代理对象:" + proxy.getClass());
        Object obj = proxy.find();
        System.out.println("find 返回对象:" + obj.getClass());
        System.out.println("----------------------------------");
        proxy.update();

        /*方法三
        * 不用单独写AdminServiceInvocation和AdminServiceDynamicProxy类,直接写在这里
        */
        System.out.println("============ 方法三 ==============");
        final AdminService target3 = new AdminServiceImpl();
        //获取代理对象
        AdminService proxy3 = (AdminService) Proxy.newProxyInstance(target3.getClass().getClassLoader(), target3.getClass().getInterfaces(), new InvocationHandler() {
            //匿名内部类实现InvocationHandler接口
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("判断用户是否有权限进行操作");
                Object obj = method.invoke(target3, args);
                System.out.println("记录用户执行操作的用户信息、更改内容和时间等");
                return obj;
            }
        });
        /*//尝试使用lambda表达式
        AdminService proxy3 = (AdminService) Proxy.newProxyInstance(target3.getClass().getClassLoader(), target3.getClass().getInterfaces(), (Object proxy1, Method method, Object[] args1) -> {
                System.out.println("判断用户是否有权限进行操作");
                Object obj1 = method.invoke(target3, args1);
                System.out.println("记录用户执行操作的用户信息、更改内容和时间等");
                return obj1;
        });*/

        Object obj3 = proxy3.find();
        System.out.println("find 返回对象:" + obj3.getClass());
        System.out.println("----------------------------------");
        proxy3.update();

    }
}
CATALOG