资讯专栏INFORMATION COLUMN

java静态代理/动态代理

ivyzhang / 1068人阅读

摘要:什么是代理大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用。这个就好比商户明星经纪人代理明星这种模式。

(1)什么是代理?

大道理上讲代理是一种软件设计模式,目的地希望能做到代码重用。具体上讲,代理这种设计模式是通过不直接访问被代理对象的方式,而访问被代理对象的方法。这个就好比 商户---->明星经纪人(代理)---->明星这种模式。我们可以不通过直接与明星对话的情况下,而通过明星经纪人(代理)与其产生间接对话

(2)什么情况下使用代理?

a. 设计模式中有一个设计原则是开闭原则,是说对修改关闭对扩展开放,我们在工作中有时会接手很多前人的代码,里面代码逻辑让人摸不着头脑(sometimes the code is really like shit),这时就很难去下手修改代码,那么这时我们就可以通过代理对类进行增强。
b. 我们在使用RPC框架的时候,框架本身并不能提前知道各个业务方要调用哪些接口的哪些方法 。那么这个时候,就可用通过动态代理的方式来建立一个中间人给客户端使用,也方便框架进行搭建逻辑,某种程度上也是客户端代码和框架松耦合的一种表现。

(3)静态代理和动态代理
静态代理比较简单,主要是多态实现,这里主要记录下动态代理

定义代理父类

package cn.crawler.split.test.proxy;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public interface Father {
    public void rent();

    public void hello(String str);
}

子类

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class Son implements Father {
    @Override
    public void rent()
    {
        System.out.println("I want to rent my house");
    }

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

代理类

package cn.crawler.split.test.proxy;

import org.springframework.cglib.proxy.InvocationHandler;

import java.lang.reflect.Method;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class DynamicProxy implements InvocationHandler
{
    // 这个就是我们要代理的真实对象
    private Object subject;

    //    构造方法,给我们要代理的真实对象赋初值
    public DynamicProxy(Object subject)
    {
        this.subject = subject;
    }

    @Override
    public Object invoke(Object object, Method method, Object[] args)
            throws Throwable
    {
        //  在代理真实对象前我们可以添加一些自己的操作
        System.out.println("before rent house");

        System.out.println("Method:" + method);

        //    当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用
        method.invoke(subject, args);

        //  在代理真实对象后我们也可以添加一些自己的操作
        System.out.println("after rent house");

        return null;
    }

}

测试类

package cn.crawler.split.test.proxy;

import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;

/**
 * Created by liang.liu04@hand-china.com
 * on 2018/7/12
 */
public class MyProxyTest {
    public static void main (String[] stra){

        //代理对象
        Father son = new Son();
        System.out.println(son.getClass());

        InvocationHandler handler  = new DynamicProxy(son);

        Father father = (Father)Proxy.newProxyInstance(handler.getClass().getClassLoader(), son.getClass().getInterfaces(), handler);
        System.out.println(father.getClass().getName());
        father.rent();
        father.hello("world");


    }
}

测试结果:

class cn.crawler.split.test.proxy.Son
org.springframework.cglib.proxy.Proxy$ProxyImpl$$EnhancerByCGLIB$$f4f3d897
before rent house
Method:public abstract void cn.crawler.split.test.proxy.Father.rent()
I want to rent my house
after rent house
before rent house
Method:public abstract void cn.crawler.split.test.proxy.Father.hello(java.lang.String)
hello: world
after rent house

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

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

相关文章

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

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

    Kaede 评论0 收藏0
  • Java代理设计模式(Proxy)的四种具体实现:静态代理动态代理

    摘要:除了和外,我们还有最后一招我直接把一个代理类的源代码用字符串拼出来,然后基于这个字符串调用的编译期,动态的创建一个新的文件,然后动态编译这个文件,这样也能得到一个新的代理类。 面试问题:Java里的代理设计模式(Proxy Design Pattern)一共有几种实现方式?这个题目很像孔乙己问茴香豆的茴字有哪几种写法? showImg(https://segmentfault.com/...

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

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

    Jason 评论0 收藏0
  • java动态代理及原理

    摘要:动态代理的产生就是这样而来的。在的方案中我们只需要这样做可以实现动态代理了。委托类实际执行类利用提供的实现动态代理代理环绕执行实际的方法利用的实现代理动态代理,有几个关键点,一个就是接口,这个方法中的方法是执行代理时会执行的方法。 什么是代理? 代理是一种设计模式,简单的说就是为某个对象提供代理,以控制这个对象的访问,在不修改原方法的情况下做方法增强,简单的可以分为两种: 静态代理 ...

    Forelax 评论0 收藏0
  • Java中的动态代理

    摘要:要明白,动态代理类的存在意义是为了拦截方法并修改逻辑而动态代理的局限性之一就是只能拦截接口所声明的方法。因为动态代理类是继承自业务类,所以该类和方法不能声明成无法继承或重写。者最终都是生成了一个新的动态代理类对象。 动态代理 1、先谈静态代理 对于静态代理,我们已经很熟悉了。我们拥有一个抽象类,真实类继承自抽象类并重写其业务方法,代理类持有真实类的对象实例,在重写业务方法中通过调用真实...

    CastlePeaK 评论0 收藏0
  • Java的三种代理模式

    Java的三种代理模式 参考:http://www.cnblogs.com/cenyu/...Java核心技术原书第九版6.5节 为什么使用代理   我们在写一个功能函数时,经常需要在其中写入与功能不是直接相关但很有必要的代 码,如日志记录,信息发送,安全和事务支持等,这些枝节性代码虽然是必要的,但它会带来以下麻烦: 枝节性代码游离在功能性代码之外,它不是函数的目的,这是对OO是一种破坏 枝节性...

    Rango 评论0 收藏0

发表评论

0条评论

ivyzhang

|高级讲师

TA的文章

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