- 概念:动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问。
- 步骤:
- 代理对象与真实对象之间建立代理关系。
- 实现代理对象的代理逻辑方法。
- JDK动态代理必须借助接口才能产生代理对象(要有接口)
- JDK动态代理是通过java.lang.reflect.*包实现的(代理类要用到该包)
1 package com.karat.cn.design.proxy.jdk;
2
3 public interface Hello {
4
5 void say();
6 }
接口
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 }
接口实现
- 第一步建立代理对象与真实对象的关系 :
- 用this保存真实对象(也可以抽出来放在代理类的构造方法中)
- newProxyInstance方法中参数:
- 第1个:是类加载器
- 第2个:是确认将生成的代理对象下挂哪一个接口
- 第3个:是定义实现方法的逻辑代理类,this表示当前类,它必须实现InvocationHandler接口的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 }
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 }
测试