java-中的代理

摘要:
静态代理:示例:interface:publicinterfaceBase{voidproxy();}接口实现类:publicclassInterfaceBaseRealimplementsInterfaceBase{publicvoidproxy(){System.out.println(“InterfaceBase…”);}}代理类:publicclassInterfaceBas

静态代理:

java-中的代理第1张

 例子:

接口:

public interface InterfaceBase {
    void proxy();
}

接口实现类:

public class InterfaceBaseReal implements InterfaceBase{
    public void proxy() {
        System.out.println("InterfaceBase......");
    }
}

代理类:

public class InterfaceBaseRealProxy  implements InterfaceBase{
    //调用之前的功能
    private InterfaceBaseReal interfaceBaseReal;
    //通过构造函数进行被代理类的初始化
    public InterfaceBaseRealProxy(InterfaceBaseReal interfaceBaseReal) {
        this.interfaceBaseReal= interfaceBaseReal;
    }

    public void proxy() {
        System.out.println("InterfaceBaseRealProxy....before");
        //调用被代理类的功能,保留原来的不变
        interfaceBaseReal.proxy();
        System.out.println("InterfaceBaseRealProxy....after");
    }
}

动态代理:

动态代理的实现步骤:
    必须有的类:被代理的类
                被代理的类所实现的接口
                实现InvocationHandler接口的类
    流程:实现IncationHandler接口,
            接口要求:通过构造函数传入被代理的类
                      在重写invoke函数里面进行被代理类方法的调用
                      编写增强逻辑
            通过Proxy类的静态方法获得代理类:
                Foo f =(Foo) Proxy.newProxyInstance(Foo.class.getClassLoader(),new Class<?>[] { Foo.class },handler); 
                                                     获取类加载器,哪个类的都可以, 一般是使用当前类
                                                     被代理类所对应接口的Class对象数组,可以多个
                                                     实现InvocationHandler的类实例

第二个接口实现类:

public class InterfaceBaseReal2 implements InterfaceBase{
    public void proxy() {
        System.out.println("InterfaceBase22222......");
    }
}

处理调用程序:

//实现InvacationHandler接口的类,这个类被成为调用处理程序
public class BaseInvocationHandler implements InvocationHandler {
    //invocationHandler实现类里面必须传入被代理的类(实现被代理接口的类)
    //这里使用对象的顶层基类,主要可以传入不同的对象
    private Object  object;
    //通过构造函数传入
    public BaseInvocationHandler(Object  object) {
        this.object= object;
    }
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("InterfaceBaseRealProxy....before");
        //调用被代理类的功能,保留原来的不变
        Object re=method.invoke(object,args);
        System.out.println("InterfaceBaseRealProxy....after");
       //返回真是代理对象,也可以通过 return proxy
        return re;
    }
}

获取代理实例:

public class HandlerTest {
    public static void main(String[] args) {
        //被代理类所实现的接口的Class对象
        Class[]inter={InterfaceBase.class};
        //被代理的类的实例
        InterfaceBase interfaceBase=new InterfaceBaseReal();
        //实现接口InvocationHandler的类的实例(必须传入被代理的类)
        BaseInvocationHandler bh=new BaseInvocationHandler(interfaceBase);
        //通过Proxy的静态函数得到代理实例
        InterfaceBase ibproxy=(InterfaceBase) Proxy.newProxyInstance(InterfaceBase.class.getClassLoader(),inter,bh);
        ibproxy.proxy();

        System.out.println(ibproxy.getClass());
        System.out.println("2222222222222222222222222222222222");
        //第二个被代理的类
        InterfaceBase interfaceBase2=new InterfaceBaseReal2();
        BaseInvocationHandler bh2 =new BaseInvocationHandler(interfaceBase2);
        InterfaceBase ibproxy2 =(InterfaceBase)Proxy.newProxyInstance(HandlerTest.class.getClassLoader(),inter,bh2);
        ibproxy2.proxy();
    }
}

注意:因为我们的处理调用程序当中设置传入的对象为Object,所以可以传入不同的对象

免责声明:文章转载自《java-中的代理》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇springboot中使用h2数据库(内存模式)unassigned_shards一直无法分配下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

API文档管理平台

一、应用场景 在公司中,有很多开发,每个人维护的api接口是不一样的。如果有一个统一的api文档管理平台,每个开发,把自己维护的接口录入进去。 之后再开发别的功能时,不需要重复造轮子,直接调用就可以了。有新员工入职时,也可以快速上手! 关于api文档管理,网上有很多。有在线收费的,也有开源的。基于节省成本考虑,这里主要介绍2个开源工具:ShowDoc和YA...

使用百度翻译的API接口

http://api.fanyi.baidu.com/api/trans/product/desktop 这是申请的接口地址,会得到一个APPID和一个钥密 然后下载PHP的对应的代码  有一个PHP文件,把这两个静态变量的值改一下就可以用了   用的话,只要使用一下这个方法就OK了,$from是要翻译的语言类型,中国当然是中文 $to是要翻译成什么语...

Yii2通过curl调用json-rpc接口

Yii2可以通过json-rpc为前端提供接口数据,通常情况睛会使用异步的形式调用接口,有时也会使用curl调用接口数据。 一、异步调用json-rpc接口 $.ajax({ type: 'POST', url: "http://localhost/index?r=test",...

NAT回流(Twice NAT)Hairping 参数详解

内网用户需要通过域名访问内网的服务器,一般商用环境是无法访问的,需要经过以下配置,原理不说了,直接说配置。 nat (inside,inside) source dynamic inside-net  interface destination static outside-ip  web-ip service  outside-port web-real...

CLR寄宿(上) MSCOREE.DLL

CLR寄宿(上) MSCOREE.DLL托管代码调用非托管代码,.NET提供了P/Invoke(平台调用)方式,它作为.NET的基础出现在各类书籍和网络资源上,这里不再讨论。那么非托管代码如何去调用托管代码呢?我们知道,一个托管应用程序首先被操作系统启动,然后由操作系统调用CLR来托管该程序。那么.NET框架到底以什么方式让操作系统来认识它并且可以启动它呢...

学习笔记之C# 教程 | 菜鸟教程

C# 教程 | 菜鸟教程 http://www.runoob.com/csharp/csharp-tutorial.html 菜鸟教程在线编辑器 http://www.runoob.com/try/runcode.php?filename=HelloWorld&type=cs C# Programming Guide - 介绍了有关关键的 C#...