看完Java的动态代理技术——Pythoner笑了

Python爬虫防止被封的方法:动态代理ip 在进行网站爬取时,我们有时会遇到一些限制,比如网站反爬虫机制,会根据IP地址进行限制。这时我们就需要使用动态IP代理来进行爬取。动态IP代理是指每一次请求时使用不同的IP地址,来避免被网站识别出来,并进行限制。本文将介绍如何使用Python爬虫实现动态IP代理,并预防被封的方法。 阅读详情

640?wx_fmt=png

Java的动态代理常用来包装原始方法调用,用于增强或改写现有方法的逻辑,它在Java技术领域被广为使用,在阿里的Sofa RPC框架序列化中你能看到它的身影,Hibernate的实体类功能增强也是以动态代理的方式解决的,还有Spring吹牛逼的AOP功能也是它搞定的。接下来我们看一个例子,该例子用于对原有的方法调用前后各打印一句话,这也算是对原有类方法的一种增强。

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

interface IHello {

    void say(String s);

}

// 待加强的目标类
class RealHello implements IHello {

    @Override
    public void say(String s) {
        System.out.println("hello " + s);
    }

}

// 增强器
class HelloDelegate implements InvocationHandler {

    private IHello target;  // 原始对象

    public HelloProxy(IHello target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("before print");
        method.invoke(target, args);  // 调用原始对象的方法
        System.out.println("after print");
        return null;
    }

}

public class DynamicProxy {

    public static void main(String[] args) {
        IHello hello = enhanceHello(new RealHello());  # 增强原始方法
        hello.say("world");
    }

    public static IHello enhanceHello(IHello target) {
        return (IHello) Proxy.newProxyInstance(DynamicProxy.class.getClassLoader(), new Class<?>[] { IHello.class },
                new HelloDelegate(target));
    }

}

输出

before print
hello world
after print
640?wx_fmt=png

为了便于理解,我们用图来表示上面的对象的关系。我们调用Proxy.newProxyInstance产生了一个匿名类实例,该实例同样实现了IHello接口,它的作用就是用来替代原生的RealHello实例。这个匿名实例持有HelloDelegate实例的引用,当你对这个匿名实例进行方法调用时,它会将调用逻辑委托给HelloDelegate实例的invoke方法。HelloDelegate实例内部又持有原生RealHello对象的引用,所以用户就可以在invoke方法里实现任意附加逻辑,以及对原生RealHello对象的调用。

上面是jdk自带的动态代理技术,它的缺点是必须定义接口才能实现目标对象的方法增强,甚至想使用abstract class来替代也不行。所以开源市场上冒出了好几个动态代理的库,用于替代原生的jdk动态代理技术,它们不仅仅功能更强大,而且内部使用了字节码增强实现,在性能上还也要比原生jdk高出很多。

javaassist

javaassist是使用最广泛的动态代理开源库。下面我们使用javaassist实现一个无需定义接口就能增强原始方法的例子。

640?wx_fmt=png
import java.lang.reflect.Method;

import javassist.util.proxy.MethodHandler;
import javassist.util.proxy.ProxyFactory;

class RealHello {

    public void say(String s) {
        System.out.println("hello " + s);
    }

}

class HelloDelegate<T> implements MethodHandler {

    private T target;

    public HelloDelegate(T target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object self, Method method, Method proceed, Object[] args) throws Throwable {
        System.out.println("before print");
        method.invoke(target, args);
        System.out.println("after print");
        return null;
    }

}

public class DynamicProxy {

    public static void main(String[] args) {
        RealHello hello = enhanceHello(new RealHello());
        hello.say("world");
    }

    @SuppressWarnings("unchecked")
    public static <T> T enhanceHello(T target) {
        ProxyFactory proxy = new ProxyFactory();
        proxy.setSuperclass(RealHello.class);
        try {
            HelloDelegate<T> delegate = new HelloDelegate<T>(target);
            // create方法传递了两个空数组
            // 分别代表构造器的参数类型数组和构造器的参数实例数组
            return (T) proxy.create(new Class<?>[0], new Object[0], delegate);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

输出

before print
hello world
after print

看起来和原生jdk提供的动态代理区别并不大,达到的效果是一样的。只不过这里要简单了很多,省去了接口类的定义。javaassist的ProxyFactory还提供了方法过滤器,它可以选择性地对特定方法进行增强。

Python

Python是动态语言,对于上面复杂的动态代理技术,它一笑而过。

640?wx_fmt=jpeg

下面我们来看看Python如果实现所谓的动态代理功能

class Proxy(object):

    def __init__(self, target):
        self.target = target
        
    def __getattribute__(self, name):
        target = object.__getattribute__(self, "target")
        attr = object.__getattribute__(target, name)
        
        def newAttr(*args, **kwargs):  # 包装
            print "before print"
            res = attr(*args, **kwargs)
            print "after print"
            return res
        return newAttr
        
class RealHello(object):

    def prints(self, s):
        print 'hello', s
        
if __name__ == '__main__':
    t = RealHello()
    p = Proxy(t)
    p.prints("world")

输出

before print
hello world
after print

我们使用了神奇的__getattribute__方法。在Python里面类的属性(方法)都是一个对象,我们先拿到这个类方法对象attr,然后对这个类方法对象进行包装,再返回包装后的新方法对象newAttr。self.target,因为self.target会再次调用__getattribute__方法,这样就会导致死循环致堆栈过深曝出异常。取而代之应该使用object.__getattribute__方法来获取对象的属性值。

以上就是Python实现动态代理的方案,读者们,你们是否觉得Python更加简单呢?欢迎大家一起来评论区吵架。

640?wx_fmt=jpeg

阅读更多精彩文章,关注公众号「码洞」

基于MATLAB和BP神经网络的音乐自动分类实践 音频分类是模式识别的重要分支,其核心挑战在于如何将原始波形转化为具备判别力的特征表示。Mel频率倒谱系数(MFCC)通过模拟人耳听觉特性,将频谱差异量化为低维向量,成为音频特征提取的主流方法。BP神经网络作为经典监督学习模型,具备逼近任意非线性映射的能力,在中小规模分类任务中表现稳定。MATLAB提供的神经网络工具箱将网络构建、训练与评估流程高度封装,大幅降低了工程实现门槛,适合快速验证分类方案。在音乐推荐、曲库自动标注等场景中,基于音频特征的自动分类可显著提升人工整理效率。本文基于MATLAB实现BP神经 阅读详情

相关推荐

论文、报告中那些乱七八糟的图(甘特图、卡吉图,桑基图,小提琴图,弦图,螺旋图,风玫瑰图)

在一些论文或报告中,总是会看到一些熟悉的图,但作者总是不能好好说话,非得搞个洋名字、缩写字或者半洋半中的词来显示它多么高大上,有时候这种故弄玄虚、华而不实的写法也实在是让人看了不伦不类,图首先是让读者更容易看懂的,不是让你来故作高深、玩玄学的。

David_jiang 9431

python中如何实现动态代理

库,Python中还有一些其他的动态代理库可以使用,具体使用方式可以参考相应的文档。类并重写需要增强的方法,在方法中添加增强逻辑实现了动态代理。Python中也有实现动态代理的方式,可以使用第三方库。库实现动态代理非常方便。以上代码中,通过继承。

zrc203的专栏 783

基于ESP32-P4的低成本旋转式激光雷达系统设计

激光雷达(LiDAR)作为机器人环境感知的核心传感器,其本质是融合光学测距、机电控制与实时数据处理的嵌入式系统。理解时间飞行(ToF)原理与机械旋转耦合机制,是实现高精度点云采集的基础;而系统级误差源——如计时抖动、电机惯性、信号串扰和温漂——直接决定实际建图鲁棒性。在资源受限场景下,选用RISC-V双核MCU(如ESP32-P4)可兼顾实时控制与网络服务能力,通过硬件时间戳捕获、S型加减速轨迹规划、旋转变压器供电及双Bank OTA等工程手段,有效平衡分辨率、帧率与稳定性。本文围绕360°旋转式激光雷达的

weixin_36231030的博客 434

高级Spring: AOP 实现之 proxy

高级Spring: AOP 实现之 proxy

qq_61313896的博客 371

从仿真到真机:如何将XTDrone的VINS-Fusion+RTABMap建图方案部署到真实无人机上?

本文详细介绍了如何将XTDrone的VINS-Fusion+RTABMap建图方案从仿真环境迁移到真实无人机上。内容涵盖硬件选型、传感器配置、VINS-Fusion调优、RTABMap性能优化以及系统集成等关键步骤,特别针对三维稠密重建在真实环境中的挑战提供了实用解决方案。

weixin_29056781的博客 244

239号资源-simulink仿真:MATLAB/Simulink教程(PDF文档)-----已提供下载资源

电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python,机器学习,计算机视觉,深度学习,神经网络,数据挖掘领域.《《《《《《《《更多资源还请持续关注本专栏》》》》》》》《《《《《《《《更多资源还请持续关注本专栏》》》》》》》论文与完整源程序_电网论文源程序的博客-优快云博客。电网论文源程序-优快云博客。

LIANG674027206的博客 1076

python 动态代理模式_python 动态代理模式 最佳模板

优点:特别添加了对属性的的操作。。缺点:不支持使用魔法方法。# coding=utf-8class NativeProxy(object):def __init__(self, target):object.__setattr__(self, "_target", target)def __getattribute__(self, item):"""修改get逻辑"""try:target = o...

weixin_29917533的博客 262

USB摄像头开发实战:从参数配置到图像采集的完整流程(Python+OpenCV)

本文详细介绍了USB摄像头开发的完整流程,从参数配置到图像采集,使用Python和OpenCV实现。内容涵盖硬件原理、环境配置、参数调优及高级优化技巧,帮助开发者解决常见问题如分辨率设置、帧率控制和灯光频闪等,提升开发效率。

star的博客 235

python 动态代理模式_5-Python与设计模式--代理模式

一、网络服务器配置白名单代理模式是一种使用频率非常高的模式,在多个著名的开源软件和当前多个著名的互联网产品后台程序中都有所应用。下面我们用一个抽象化的简单例子,来说明代理模式。首先,构造一个网络服务器:#该服务器接受如下格式数据,addr代表地址,content代表接收的信息内容info_struct=dict()info_struct["addr"]=10000info_struct["cont...

weixin_31567239的博客 335

1 初识智能化测试

非常感谢您可以和我一起来聊一聊智能化测试的一些事。智能化测试是一个新鲜又老旧的问题,说新鲜是因为很多人当听到智能化测试都会联想到人工智能、机器学习、深度学习等高大上的技术,很多时候觉得离我们的实际工作还很远;说老旧,是因为智能化测试的一些技术的发展在行业里面已经很久了,例如符号执行、静态分析等技术已经有很长的历史了。近些年,随着测试技术的的飞速发展,智能化测试也有了越来越多的实践,优秀的开源项目慢慢的被行业推行并且落地。那么在这里我们就一起来聊聊智能化测试以及智能化测试好的思路、实践、方法以及技术落地过程。

Criss@陈磊 2626

【产品】 产品设计:如何解决铝合金氧化着色后表面硬度低的问题(硬质氧化)

1、氧化处理技术 1)化学氧化 化学氧化处理所获得的膜层较薄,一般厚度为0.5μm ~4μm,质软不耐磨,抗蚀能力低于阳极氧化膜。 一般不宜单独便用,由于化学氧化膜吸附能力好,主要作用于油漆的底层,化学氧化按其溶液性可分为碱性和酸性两种。按其膜层性质可分为氧化膜,磷酸盐膜、铬酸盐膜及磷酸一铬酸盐膜等(这类型的氧化膜是可导电)。 2)电化学氧化(阳极氧化) 电化学氧化(俗称阳极氧化)是铝及...

产品线负责人 9743

python 动态代理模式_看完Java的动态代理技术——Pythoner笑了

Java的动态代理常用来包装原始方法调用,用于增强或改写现有方法的逻辑,它在Java技术领域被广为使用,在阿里的Sofa RPC框架序列化中你能看到它的身影,Hibernate的实体类功能增强也是以动态代理的方式解决的,还有Spring吹牛逼的AOP功能也是它搞定的。接下来我们看一个例子,该例子用于对原有的方法调用前后各打印一句话,这也算是对原有类方法的一种增强。import java.lang....

weixin_35943736的博客 199

LPDDR6与LPDDR5 ZQ Calibration技术探讨

LPDDR6与LPDDR5 ZQ Calibration技术探讨

zilan23的博客 1105

python 动态代理模式_设计模式 - 动态代理模式

package com.DynamicProxy3;/*** 动态代理: 抽象角色(公共接口)** @author DW**/public interface DoSomething{public void working(String work);}package com.DynamicProxy3;/*** 动态代理: 真实角色** @author DW**/public class Man ...

weixin_34562922的博客 406

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Python代理模式介绍、使用

Python代理模式(Proxy Pattern)是一种结构型设计模式。在代理模式中,代理对象充当了另一个对象的占位符,以控制对该对象的访问。代理对象和被代理对象实现了相同的接口,因此它们可以互相替代。客户端和代理对象之间的交互是无缝的,因为它们的接口是一样的。代理模式的主要功能是为其他对象提供一个代理,以控制对对象的访问。代理对象可以在调用被代理对象之前或之后执行一些操作,例如身份验证,缓存等。代理模式可以通过组合或继承实现。

captain 3237

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

python 动态代理模式_如何理解动态代理?

代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位。代理模式从类型上来说,可以分为静态代理和动态代理两种类型。在开始之前,我们先假设这样一个场景:有一个蛋糕店,它们卖的蛋糕都是用蛋糕机做的,而且不同种类的蛋糕由不同的蛋糕机来做,这样就有:水果蛋糕机、巧克力蛋糕机等。它们卖的面包片也是用面包机做的,同样不同种类的面包片也是由不...

weixin_39811036的博客 492

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python 代理模式:控制对象访问的智能中介

Python 中的代理模式是一种强大的结构型设计模式,它通过代理对象为真实对象提供了一种间接的访问方式,并能够在这个过程中添加各种额外的逻辑。通过理解抽象主题、真实主题和代理这些关键要点,我们可以根据不同的应用场景实现代理模式,包括远程代理、虚拟代理和保护代理等。在与装饰器模式和适配器模式的比较中,我们可以更清晰地看到代理模式的特点和优势,从而在不同的编程场景中准确地选择合适的设计模式,提高软件的可维护性和可扩展性。

liuhailong0511的博客 1565

聊聊设计模式的代理模式

介绍 代理模式类似于生活中的中介,由中介帮忙负责处理相关事情。具体体现为代理类和实现类都实现同一个接口,代理类的实现直接依赖的实现类的逻辑,而自己不处理具体的逻辑。这里不用中介来说明,中介会有点绕,用一个工地包工头来说明,老板跟包工头说明要怎么干,包工头清楚后,就安排工地工人实际干活,对于老板来说,不需要知道工人是怎么工作的,只需要知道包工头。代理模式分为静态代理和动态代理。 静态代理 结构 定义一个抽象接口 定义一个具体实现类 定义一个代理类,关联到实现类,代理类的方法实现依赖实现类 场景类中,通过代理

bpk_2的博客 218

python中代理模式分为几种类型_java代理模式的分类

说到代理,大家肯定都有接触过。毕竟当有些事务不想亲自处理时,会选择委托给别人进行解决。那么在java中也有着这样的机制,叫做代理模式。主要分为两大类:静态代理和动态代理。一种是运行前就存在,另一种是运行后才进行创建。下面我们就java中的两种代理模式进行讲解。1.静态代理由程序员创建或者由第三方工具生成,再进行编译;在程序运行之前,代理类的.class文件已经存在了。静态代理通常只代理一个类,并且...

weixin_42572602的博客 190

手把手教你实现Python的动态代理

阿斯大锁

随便写写 2028

Python使用动态代理的都可以用来做什么

Python使用动态代理(Dynamic Proxy)的用途广泛,特别是在需要控制、修改或增强对象行为的情况下。动态代理允许开发者在不修改原始类代码的情况下,为对象添加额外的功能或行为。

KookeeyLena8的博客 388

【Python爬虫高手进阶必备】:动态代理设置全流程详解

掌握Python爬虫代理设置技巧,有效突破IP封锁难题。详解动态代理配置流程,涵盖HTTP/HTTPS协议适配、随机切换机制与异常重试策略,适用于大规模数据采集场景。提升爬虫稳定性与效率,实战代码示例解析,值得收藏。

CodeNexus的博客 1181

设计模式--代理模式

在代理模式(Proxy Pattern)中,一个类代表另一个类的功能。这种类型的设计模式属于结构型模式。 在代理模式中,我们创建具有现有对象的对象,以便向外界提供功能接口。 1 介绍 意图:为其他对象提供一种代理以控制对这个对象的访问。 主要解决:在直接访问对象时带来的问题,比如说:要访问的对象在远程的机器上。在面向对象系统中,有些对象由于某些原因(比如对象创建开销很大,或者某些操作需要安全控制,...

每天多学一点点. 的博客 396

Python:动态代理机制

最近开始学习python,发现python很方便,提供了丰富的函数支持反射,本人之前主要以java编程为主,在学习python的过程中,学习到了Python的装饰器,结合之前java的代理模式,于是想要编写基于python的对象代理代理模式的理论知识网上有很多相关的材料,总而言之就是对象有一个配套的代理对象,对代理对象进行调用时,代理对象转发调用给实际对象本身下面介绍一些自己写的一些类:Proxy...

water_likud的博客 4022
上一篇: 深入Python多进程通信原理与实战——图文
下一篇: 求不更学不动之Redis5.0新特性Stream尝鲜
码洞
博客等级 码龄10年 41粉丝 137原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值