JDK动态代理

  • 概念:动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问。
  • 步骤:
  1. 代理对象与真实对象之间建立代理关系。
  2. 实现代理对象的代理逻辑方法。
  • 条件:
  1. JDK动态代理必须借助接口才能产生代理对象(要有接口)
  2. 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. 第1个:是类加载器
  2. 第2个:是确认将生成的代理对象下挂哪一个接口
  3. 第3个:是定义实现方法的逻辑代理类,this表示当前类,它必须实现InvocationHandler接口的invoke方法,也就是下面的代理类逻辑实现方法
  • 第二步实现代理逻辑方法:
    • invoke方法中参数:
  1. 第1个:代理对象
  2. 第2个:当前调度的方法
  3. 第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 }
测试
原文地址:https://www.cnblogs.com/LJing21/p/10668251.html