当前位置:首页 > CN2资讯 > 正文内容

静态代理和动态代理简介静态代理和动态代理

2天前CN2资讯


文章目录

  • ​​第一章 前言​​
  • ​​第二章 静态代理​​
  • ​​第三章 动态代理​​
  • ​​3.1 JDK动态代理​​
  • ​​3.2 CGLIB动态代理​​

第一章 前言

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

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

}
}


    你可能想看:

    扫描二维码推送至手机访问。

    版权声明:本文由皇冠云发布,如需转载请注明出处。

    本文链接:https://www.idchg.com/info/24024.html

    分享给朋友:

    “静态代理和动态代理简介静态代理和动态代理” 的相关文章

    如何利用VPS挖矿赚钱:低成本高收益的加密货币挖矿指南

    VPS挖矿的基本概念 VPS挖矿是一种利用虚拟专用服务器(VPS)的计算资源进行加密货币挖矿的方式。VPS通常用于托管网站或运行应用程序,但它的计算能力也可以被用来执行挖矿算法。挖矿本质上是通过解决复杂的数学问题来验证交易并创建新的加密货币区块,作为回报,矿工会获得一定数量的加密货币。VPS挖矿特别...

    如何高效管理Ubuntu服务器:从基础到高级的全面指南

    管理Ubuntu服务器是一个需要掌握多种技能的任务。从选择合适的Linux发行版到系统初始化,再到账号和权限管理,每一个环节都至关重要。以下是一些基础的管理技巧,帮助你更好地配置和管理Ubuntu服务器。 1.1 选择合适的Linux发行版 在国内,常用的Linux发行版有CentOS、Ubuntu...

    CN2 GIA:享受高效稳定的国际网络连接服务

    CN2 GIA 概述 CN2 GIA,即全球互联网接入,是由中国电信推出的一个国际专线网络服务。作为CN2系列服务中最顶尖的产品,CN2 GIA 主要面向那些需要稳定、快速国际网络连接的用户。设想一下,有多少次我们正在进行重要的商务沟通,却因为网络问题而中断。针对这样的需求,CN2 GIA无疑提供了...

    Hostwinds LLC:卓越的网络托管服务与高性价比优势

    Hostwinds LLC成立于2010年,位于美国西雅图。这家公司一直专注于提供多种网络托管服务,包括虚拟主机、虚拟专用服务器(VPS)和独立服务器。在这个竞争激烈的市场中,Hostwinds凭借其独特的优势和不断升级的服务赢得了客户的信赖。我个人认为,Hostwinds的历史反映了它对客户需求的...

    VPS论坛:虚拟主机爱好者的交流与学习平台

    VPS论坛概述 VPS论坛是一个专为VPS主机爱好者提供交流与分享的平台。在这里,像我这样对VPS感兴趣的人们,可以参与关于虚拟专用服务器的各种讨论。VPS实际上属于一个相对小众的领域,因此知名的VPS论坛数量较少,但它们所承载的信息和交流却是丰富多彩的。这些论坛不仅是获取信息的重要来源,更是与其他...

    如何在PVE中使用OVA文件进行高效虚拟机管理

    在探讨PVE和OVA之前,我想分享一下我的个人体验。近年来,随着云计算和虚拟化技术的飞速发展,我们越来越频繁地接触到这些概念。PVE,即Proxmox Virtual Environment,成为了许多企业青睐的虚拟化解决方案。而OVA,则丰富了我们对动画内容的理解。接下来,我将分别介绍这两个重要的...