资讯专栏INFORMATION COLUMN

动态代理-Proxy

Warren / 2665人阅读

摘要:主要目的是记录动态代理的实现,为的学习做铺垫。什么是动态代理动态代理就是在运行时为某个类生成代理,即在阶段,没有实际的文件与其对应。话不多说,直接看动态代理的例子将该代理类保存下来,查看源码

主要目的是记录java动态代理的实现,为rpc的学习做铺垫。

什么是动态代理?
动态代理就是在java运行时为某个类生成代理,即在code阶段,没有实际的java文件与其对应。

java实现动态代理的类就是反射包中的Proxy类。
话不多说,直接看动态代理的例子:

public class TestProxy {
    public static void main(String[] args) {
        PaoTui paoTuiProxy = (PaoTui)Proxy.newProxyInstance(
                PaoTui.class.getClassLoader(), 
                new Class[]{PaoTui.class},
                new InvocationHandler() {
                    Flan flan = new Flan();
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        return method.invoke(flan, args);
                    }}
                );

        paoTuiProxy.buySomething("an apple");
        System.out.println(paoTuiProxy.toString());
    }
}

interface PaoTui {
    void buySomething(String something);
}

class Flan implements PaoTui {
    @Override
    public void buySomething(String something) {
        System.out.println("Flan buys "+something+" for Remi");
    }
}

将该代理类保存下来,查看源码:

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

public final class $Proxy0 extends Proxy implements PaoTui {
    private static Method m1;
    private static Method m2;
    private static Method m3;
    private static Method m0;

    public $Proxy0(InvocationHandler var1) throws  {
        super(var1);
    }

    public final boolean equals(Object var1) throws  {
        try {
            return ((Boolean)super.h.invoke(this, m1, new Object[]{var1})).booleanValue();
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final String toString() throws  {
        try {
            return (String)super.h.invoke(this, m2, (Object[])null);
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    public final void buySomething(String var1) throws  {
        try {
            super.h.invoke(this, m3, new Object[]{var1});
        } catch (RuntimeException | Error var3) {
            throw var3;
        } catch (Throwable var4) {
            throw new UndeclaredThrowableException(var4);
        }
    }

    public final int hashCode() throws  {
        try {
            return ((Integer)super.h.invoke(this, m0, (Object[])null)).intValue();
        } catch (RuntimeException | Error var2) {
            throw var2;
        } catch (Throwable var3) {
            throw new UndeclaredThrowableException(var3);
        }
    }

    static {
        try {
            m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[]{Class.forName("java.lang.Object")});
            m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);
            m3 = Class.forName("PaoTui").getMethod("buySomething", new Class[]{Class.forName("java.lang.String")});
            m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);
        } catch (NoSuchMethodException var2) {
            throw new NoSuchMethodError(var2.getMessage());
        } catch (ClassNotFoundException var3) {
            throw new NoClassDefFoundError(var3.getMessage());
        }
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73645.html

相关文章

  • Java三种代理模式:静态代理动态代理和cglib代理

    摘要:动态代理又被称为代理或接口代理。静态代理在编译时产生字节码文件,可以直接使用,效率高。代理无需实现接口,通过生成类字节码实现代理,比反射稍快,不存在性能问题,但会继承目标对象,需要重写方法,所以目标对象不能为类。 一、代理模式介绍 代理模式是一种设计模式,提供了对目标对象额外的访问方式,即通过代理对象访问目标对象,这样可以在不修改原目标对象的前提下,提供额外的功能操作,扩展目标对象的功...

    Kaede 评论0 收藏0
  • Java 动态代理(Dynamic proxy) 小结

    摘要:代理模式基本概念不论是静态代理还是动态代理其本质都是代理模式的一种实现那么什么是代理模式呢代理模式即给某一个对象提供一个代理并由代理对象控制对原对象的引用代理模式其实取材于实际生活例如我们生活中常见的房屋租赁代理我们在租房时一般不是直接和房 代理模式 基本概念 不论是静态代理还是动态代理, 其本质都是代理模式的一种实现, 那么什么是代理模式呢?代理模式, 即给某一个对象提供一个代理, ...

    Jason 评论0 收藏0
  • 慕课网_《模式的秘密之代理模式》学习总结

    时间:2017年08月28日星期一说明:本文部分内容均来自慕课网。@慕课网:http://www.imooc.com教学源码:https://github.com/zccodere/s...学习源码:https://github.com/zccodere/s... 第一章:代理模式 1-1 概念介绍 学习本课程基础 面向对象的设计思维 了解多态的概念 了解反射机制 课程目标 代理模式基本概念及分类...

    wow_worktile 评论0 收藏0
  • JDK动态代理的理解与分析

    摘要:类所实现的方法包装了对被代理对象的反射调用,后文中的动态代理类正是调用此方法来调用被代理对象的方法。 前言 java的设计模式中有一项设计模式叫做代理模式,所谓代理模式,就是通过代理方来操作目标对象,而不是自己直接调用。代理又分为静态代理和动态代理,静态代理就是针对每个被代理对象写一个代理类,操作不够优雅;动态代理,可以根据接口动态的生成代理类,这动态生成的类不需要自己书写,jdk帮你...

    stormjun 评论0 收藏0
  • JAVA代理模式的理解和应用

    摘要:代理模式代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。 代理模式: 代理模式通俗一点的解释就是在操作一个对象和对象中的方法时,不是直接操作这个对象,还是通过一个代理对象来操作这个实际的目标对象。应用场景一般是需要在执行某个已经写好的方法前后再添加一段逻辑,比如执行方法前打印日志,或者在执行方法之前和之后打时...

    CatalpaFlat 评论0 收藏0
  • 吃透动态代理,解密spring AOP源码(二)

    摘要:紧接着上节,为了解决静态代理的问题,出现了动态代理,假设动态代理是一个代购公司,私有变量为动态生成的具体的真实对象,可代购对应的产品。这个注释是说提供个一个静态方法来创建代理类和代理实例,它也是所有由此方法创建的代理类的父类。 紧接着上节,为了解决静态代理的问题,出现了动态代理, 假设动态代理是一个代购公司,私有变量Object factory为动态生成的具体的真实对象,可代购对应的产...

    tianyu 评论0 收藏0

发表评论

0条评论

Warren

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<