专栏首页Nicky's blog静态代理和动态代理简介

静态代理和动态代理简介

第一章 前言

在某些情况下,一个客户不想或者不能直接引用一个对象,此时可以通过一个称之为“代理”的第三者来实现间接引用。代理对象可以在客户端和目标对象之间起到中介的作用,并且可以通过代理对象去掉客户不能看到的内容和服务或者添加客户需要的额外服务。 代理模式的角色分为: 主题接口: 即代理类的所实现的行为接口。 目标对象: 也就是被代理的对象。 代理对象: 用来封装真是主题类的代理类 客户端:即用来实现的类

代理模式分为静态代理和动态代理 • 静态代理:静态代理就是编译阶段就生成代理类来完成对代理对象的一系列操作。 • 动态代理:动态代理是指在运行时动态生成代理类。即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader。

第二章 静态代理

静态代理:静态代理就是编译阶段就生成代理类来完成对代理对象的一系列操作。 主题接口:

public   interface Subject  {    
	abstract   public   void  request(); 
}   

目标对象:

public   class  RealSubject  implements Subject  {    		  	       
   public   void  request()  {         
	   System.out.println( " From real subject. " );     
   }  
}  

代理对象:

public   class  StaticProxySubject  implements Subject  { 
    private  RealSubject  realSubject;  // 以真实角色作为代理角色的属性  
    public  ProxySubject()  { }  
    public  void  request()  {  // 该方法封装了真实对象的request方法        
    //懒加载,用的时候才加载
	if ( realSubject  ==   null  )  { 
		realSubject  =   new  RealSubject();        
	}   
	realSubject.request();  // 此处执行真实对象的request方法   
   } 
}

编写客户端类:

public class Client{
	StaticProxySubject sps = new StaticProxySubject();
	sps.request();
}

第三章 动态代理

动态代理:动态代理是指在运行时动态生成代理类。即,代理类的字节码将在运行时生成并载入当前代理的 ClassLoader。 生成动态代理的方法有很多: JDK中自带动态代理,CGlib, javassist等。

3.1 JDK动态代理

Proxy类。该类即为动态代理类,该类最常用的方法为:public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException

newProxyInstance()方法用于根据传入的接口类型interfaces返回一个动态创建的代理类的实例,方法中第一个参数loader表示代理类的类加载器,第二个参数interfaces表示被代理类实现的接口列表,第三个参数h表示所指派的调用处理程序类。

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

public class MyInvocationHandler implements InvocationHandler {
    private Class<?> target;//委托类
    public MyInvocationHandler(Class<?> target){
        this.target=target;
    }
	//实际执行类bind
    public  Object bind(Class<?> target){
        //利用JDK提供的Proxy实现动态代理
        return  Proxy.newProxyInstance(target.getClassLoader(),
        		new Class[]{target},this);
    }
    
    @Override
    public Object invoke(Object o, Method method, Object[] args) throws Throwable {
		/**代理环绕**/
        //执行实际的方法
        Object invoke = method.invoke(target, args);
        return invoke;
    }
}

3.2 CGLIB动态代理

CGLIB动态代理实现相关类需要在项目中导入 cglib-nodep-2.1_3.jar ,主要涉及两个类: MethodInterceptor接口。它是代理实例的调用处理程序实现的接口,该接口中定义了如下方法:public Object intercept(Object proxy, Method method, Object[] arg2, MethodProxy mp);

intercept()方法中第一个参数proxy表示代理类,第二个参数method表示需要代理的方法,第三个参数args表示代理方法的参数数组,第四个参数mp用 来去调用被代理对象方法

package com.demo;

import java.lang.reflect.Method;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

public class MyInterceptor implements MethodInterceptor{	
    private Object target; ;//代理的目标对象
    public MyInterceptor(Object target) {
        this.target = target;
    } 
//proxy 在其上调用方法的代理实例    method拦截的方法    args  拦截的参数
 //invocation 用来去调用被代理对象方法
    @Override
    public Object intercept(Object proxy, Method method, Object[] args, 
                                         MethodProxy invocation) throws Throwable {
        //1.记录日志 2.时间统计开始   3.安全检查
        Object retVal = invocation.invoke(target, args);  
        //4.时间统计结束
        return retVal;   
    }
//创建代理对象的方法
    public Object proxy(Object target) {
		this.target = target;
		Enhancer enhancer = new Enhancer();//该类用于生成代理类		
		enhancer.setSuperclass(this.target.getClass());//设置父类
		enhancer.setCallback(this);//设置回调用对象为本身
		return enhancer.create();

   }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 设计模式之代理模式(结构型)

    代理模式:代理模式就是引入一个代理对象,通过代理对象实现对原对象的引用。代理模式是一种对象结构型。

    SmileNicky
  • 基于Spring Data JPA框架的文章归档实现

    最近在写自己的个人博客系统,框架采用SpringMVC、Spring4.0、Spring Data/JPA组合,本博客就文档归档功能在Spring Data J...

    SmileNicky
  • editormd实现Markdown编辑器写文章功能

    想在项目里引入Markdown编辑器实现写文章功能,网上找到一款开源的插件editormd.js

    SmileNicky
  • 设计模式之代理模式(结构型)

    代理模式:代理模式就是引入一个代理对象,通过代理对象实现对原对象的引用。代理模式是一种对象结构型。

    SmileNicky
  • 详解Java动态代理机制

         之前介绍的反射和注解都是Java中的动态特性,还有即将介绍的动态代理也是Java中的一个动态特性。这些动态特性使得我们的程序很灵活。动态代理是面向AO...

    Single
  • Spring AOP高级——源码实现(1)动态代理技术

    jdk1.8.0_144   在正式进入Spring AOP的源码实现前,我们需要准备一定的基础也就是面向切面编程的核心——动态代理。 动态代理实际上也是一种...

    用户1148394
  • 【Java设计模式】之代理模式

    代理模式是Java常见的设计模式之一。所谓代理模式是指客户端并不直接调用实际的对象,而是通过调用代理,来间接的调用实际的对象。 为什么要采用这种间接的形式来调...

    用户5640963
  • Java代理和动态代理机制分析和应用

    本博文中项目代码已开源下载地址:GitHub Java代理和动态代理机制分析和应用 概述 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个...

    CrazyCodeBoy
  • Java 动态代理初探

    对于使用过 Spring 的朋友, 应该都使用过 AOP, 那么今天我们来对 AOP 的原理: 动态代理 来一探究竟.

    一份执着✘
  • 打造一款 刷Java 知识的小程序(二)

    痛点:Markdown转小程序页面很难受,小程序页面并不能识别Markdown标记。

    悟空聊架构

扫码关注云+社区

领取腾讯云代金券