• 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 }
    测试
  • 相关阅读:
    git的使用
    本体建模
    word2vec改进之Negative Sampling
    word2vec改进之Hierarchical Softmax
    word2vec原理
    Window下mysql的安装
    PageRank算法
    集成学习-------简单介绍
    自我介绍
    Apollo学习笔记(二):循迹实现过程
  • 原文地址:https://www.cnblogs.com/LJing21/p/10668251.html
Copyright © 2020-2023  润新知