美文网首页
动态代理之python与java

动态代理之python与java

作者: hugoren | 来源:发表于2018-06-01 15:42 被阅读0次

动态代理适用场景

需要统一入口调用

python动态代理的原理

类似于装饰器的闭包调用方法, 这与python的反射

python动态代理方案

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

python动态代理代码

class Proxy:
    def __init__(self, target):
        self.target = target

    def __getattribute__(self, item):
        target = object.__getattribute__(self, "target")
        attr = object.__getattribute__(target, item)

        def new_attr(*args, **kwargs):
            return attr(*args, **kwargs)
        return new_attr


class Hello:
    def __init__(self, test):
        self.test = test
    def prints(self):
        print(self.test)


def t2():
    print("t2")

h = Hello("test")
p = Proxy(h)
p.prints()
image.png

java动态代理代码

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;
    }

}

参考:
https://mp.weixin.qq.com/s/1vNjLztu3daEAfRGCuCF9g

相关文章

  • Java 动态代理

    java的动态代理机制详解 JDK动态代理详解 Java核心技术点之动态代理

  • 动态代理之python与java

    动态代理适用场景 需要统一入口调用 python动态代理的原理 类似于装饰器的闭包调用方法, 这与python的反...

  • Java代理模式之JDK动态代理

    了解什么是动态代理模式,可参考Java设计模式之代理模式 简介 JDK动态代理是java.lang.reflect...

  • Spring AOP源码解析

    欲了解AOP,需先了解Java动态代理;欲了解Java动态代理,先熟悉设计模式之代理模式。入门有道,先从简学。 1...

  • JDK动态代理详解

    JDK动态代理详解 java动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及...

  • 公共知识复习

    动态代理 公共技术点之 Java 动态代理 @codeKK 开源站 屏幕适配 android机型适配终极篇 - C...

  • Java动态代理从入门到原理再到实战

    目录 前言 什么是动态代理,和静态代理有什么区别 Java动态代理的简单使用 Java动态代理的原理解读 动态代理...

  • java反射和动态代理

    java动态代理Proxy.newProxyInstance 详解java代理机制(静态代理、动态代理)以及使用场景

  • java动态代理,python装饰器

    原文:java的动态代理机制详解 - xiaoluo501395377 - 博客园 python装饰器

  • 保存java 动态代理生成的字节码文件

    保存java 动态代理生成的字节码文件 在Java中,常用的动态代理技术有JDK的动态代理和cglib动态代理,不...

网友评论

      本文标题:动态代理之python与java

      本文链接:https://www.haomeiwen.com/subject/xnkksftx.html