概念:

动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

步骤:

1.代理对象与真实对象之间建立代理关系。

2.实现代理对象的代理逻辑方法。

条件:

1.JDK动态代理必须借助接口才能产生代理对象(要有接口)

2.JDK动态代理是通过java.lang.reflect.*包实现的(代理类要用到该包)

实现:

JDK动态代理 随笔 第1张
1 package com.karat.cn.design.proxy.jdk;
2 
3 public interface Hello {
4 
5     void say();
6 }
接口 JDK动态代理 随笔 第3张
 1 package com.karat.cn.design.proxy.jdk;
 2 
 3 public class HelloImpl implements Hello{
 4 
 5     @Override
 6     public void say() {
 7         // TODO Auto-generated method stub
 8         System.out.println("晚安世界");
 9     }
10 
11 }
接口实现

第一步建立代理对象与真实对象的关系 :

1.用this保存真实对象(也可以抽出来放在代理类的构造方法中)

2.newProxyInstance方法中参数:

第1个:是类加载器

第2个:是确认将生成的代理对象下挂哪一个接口

第3个:是定义实现方法的逻辑代理类,this表示当前类,

     它必须实现InvocationHandler接口的invoke方法,也就是下面的代理类逻辑实现方法

第二步实现代理逻辑方法:

1.invoke方法中参数:

第1个:代理对象

第2个:当前调度的方法

第3个:调度方法的参数

 1 package com.karat.cn.design.proxy.jdk;
 2 
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 import java.lang.reflect.Proxy;
 6 
 7 public class JdkProxyExample implements InvocationHandler{
 8     //真实对象
 9     private Object target=null;
10     
11     /**
12      * 建立代理对象与真实对象之间的代理关系
13      * @param target 真实对象
14      * @return 代理对象
15      */
16     public Object bind(Object target) {
17         this.target=target;
18         //生成代理对象
19         return Proxy.newProxyInstance(target.getClass().getClassLoader(),
20                 target.getClass().getInterfaces(), this);
21     }
22     /**
23      * 代理方法逻辑
24      * arg0:代理对象(bind返回的对象)
25      * arg1:当前调度方法
26      * arg2:调度方法的参数
27      */
28     @Override
29     public Object invoke(Object arg0, Method arg1, Object[] arg2) throws Throwable {
30         // TODO Auto-generated method stub
31         System.out.println("进入代理");
32         System.out.println("在调度真实对象之前操作");
33         Object object=arg1.invoke(target, arg2);
34         System.out.println("在调度真实对象之后操作");
35         return object;
36     }
37 
38 }
JDK动态代理 随笔 第5张
 1 package com.karat.cn.design.proxy.jdk;
 2 
 3 public class TestJdkProxy {
 4 
 5     public static void main(String args[]) {
 6         JdkProxyExample example=new JdkProxyExample();
 7         Hello hello=(Hello)example.bind(new HelloImpl());
 8         hello.say();
 9     }
10 }
测试

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄