Coin163

首页 > Java代理模式详解,静态代理和动态代理的实现

Java代理模式详解,静态代理和动态代理的实现

相关标签: java

2020腾讯云双十一活动,全年最低!!!(领取3500元代金券),
地址https://cloud.tencent.com/act/cps/redirect?redirect=1074

【阿里云】双十一活动,全年抄底价,限时3天!(老用户也有),
入口地址https://www.aliyun.com/1111/home

相关推荐:java 设计模式 动态代理

动态代理的工作是: 在一段程序的外面在包上一段其他程序,这样就会比较方便 这里要注意,是指的是在仅仅是方法外层包上一层其他方法,而不是抱在jdk把方法实例化后再包上其他方法 如果实例化后,这里会包上一层jdk 为程序运行加上的虚拟机程序 首先应该想到

Java代理模式

使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且在不改变目标对象的情况下添加一些额外的功能,感觉跟Java中的持有对象类似,从设计模式上说应该Java中有2中获取其他类功能的方法1、持有对方的对象(个人感觉就是静态代理)2、继承

我们可以看看代理模式的整体设计图

其中静态代理就是:自己创建对应的代理对象而动态代理就是自动创建对应的代理对象。对于静态代理可以很好地理解,就是在类中使用构造参数或者getter、setter方法来将目标对象放入到代理对象中。

而动态代理的实现就较为复杂了,DynamicProxy类实现JDK自带的java.lang.reflect.InvocationHandler接口,该接口中的invoke()方法能够让DynamicProxy实例在运行时调用被代理类的“对外服务”,即调用被代理类需要对外实现的所有接口中的方法,也就是完成对真实方法的调用,Java帮助文档中称这些真实方法为处理程序。

具体实现如下:

import java.lang.reflect.InvocationHandler; 

import java.lang.reflect.Method; 

import java.lang.reflect.Proxy; 

 

//抽象主题类,这里不能用abstract抽象类,一定要是interface 

interface AbstractSubject { 

    public abstract void request(); 

 

// 真实主题类,即被代理类  

class RealSubject implements AbstractSubject { 

    public void request() { 

        System.out.println("RealSubject's request() ..."); 

    } 

 

// 动态代理类,实现InvocationHandler接口  

class DynamicProxy implements InvocationHandler { 

 

    // 被代理类的实例  

    Object obj = null; 

 

    // 将被代理者的实例传进动态代理类的构造函数中  

    public DynamicProxy(Object obj) { 

        this.obj = obj; 

    } 

 

    /** 

     * 覆盖InvocationHandler接口中的invoke()方法  

     *  

     * 更重要的是,动态代理模式可以使得我们在不改变原来已有的代码结构  

     * 的情况下,对原来的“真实方法”进行扩展、增强其功能,并且可以达到  

     * 控制被代理对象的行为,下面的before、after就是我们可以进行特殊  

     * 代码切入的扩展点了。  

     */ 

    public Object invoke(Object proxy, Method method, Object[] args) 

            throws Throwable { 

        /* 

相关推荐:Java深入浅出系列(四)——深入剖析动态代理--从静态代理到动态代理的演化

静态代理             如上图,在程序运行之前,程序员就要编写Proxy,然后进行编译,即在程序运行之前,代理类的字节码文件就已经生成了(Proxy类的class文件已经存在了)。            静态代理虽然在增强现有的接口业务功能方面有很大优点,但是大量使用这

         * before :doSomething(); 

         */ 

        Object result = method.invoke(this.obj, args); 

         

        /* 

         * after : doSomething(); 

         */ 

        return result; 

    } 

 

// 测试类  

public class Client { 

    public static void main(String[] args) { 

 

        // 被代理类的实例  

        AbstractSubject realSubject = new RealSubject(); 

 

        // 获得被代理类的类加载器,使得JVM能够加载并找到被代理类的内部结构,以及已实现的interface 

        ClassLoader loader = realSubject.getClass().getClassLoader(); 

 

        // 获得被代理类已实现的所有接口interface,使得动态代理类的实例  

        Class<?>[] interfaces = realSubject.getClass().getInterfaces(); 

 

        // 用被代理类的实例创建动态代理类的实例,用于真正调用处理程序  

        InvocationHandler handler = new DynamicProxy(realSubject); 

 

        /* 

         * loader : 被代理类的类加载器  

         * interfaces :被代理类已实现的所有接口,而这些是动态代理类要实现的接口列表  

         * handler : 用被代理类的实例创建动态代理类的实例,用于真正调用处理程序  

         *  

         * return :返回实现了被代理类所实现的所有接口的Object对象,即动态代理,需要强制转型  

         */ 

        //获得代理的实例  

        AbstractSubject proxy = (AbstractSubject) Proxy.newProxyInstance( 

                loader, interfaces, handler); 

 

        proxy.request(); 

        //打印出该代理实例的名称  

        System.out.println(proxy.getClass().getName()); 

    } 

其中动态代理部分代码摘自—http://haolloyin.blog.51cto.com/1177454/333257

 

原文

Java代理模式 使用代理模式创建代理对象,让代理对象控制目标对象的访问,并且在不改变目标对象的情况下添加一些额外的功能,感觉跟Java中的持有对象类似,从设计模式上说应该Java中有2中获取其

------分隔线----------------------------