首页 > 编程语言 > 详细

java动态代理之究竟如何创建代理对象

时间:2020-03-29 15:55:27      阅读:623      评论:0      收藏:0      [点我收藏+]

 按照网上的惯例,先给出静态代理到动态代理的例子吧;要不然后面的话理论和源码分析没有铺垫,大家都有点迷糊。

静态代理:

/**
 * 声音接口,用于代理接口
 */
public interface IVoice {

    void song();
}

 

/**
 * 歌手类
 */
public class Singer implements IVoice{

    public void song(){
        System.out.println("歌手在唱歌...");
    }
}

 

/**
 * 代理类:喇叭(英语单词太难了,怕你们不认识,直接用拼音了)
 */
public class LaBa implements IVoice{

    private IVoice voice;

    public LaBa(IVoice voice) {
        this.voice = voice;
    }

    public void song() {
        System.out.println("歌手的声音被我放大了");
        this.voice.song();
        System.out.println("歌手停止说话了");
    }
}

执行类:

public class Main {
    public static void main(String[] args) {
        Singer singer=new Singer();
        IVoice voice=new LaBa(singer);
        voice.song();
    }
}

打印结果:

技术分享图片

 

上面的接口似乎没有什么作用,如果我们把接口去掉呢?

/**
 * 歌手类
 */
public class Singer {
    public void song(){
        System.out.println("歌手在唱歌...");
    }
}

 

/**
 * 代理类:喇叭(英语单词太难了,怕你们不认识,直接用拼音了)
 */
public class LaBa {
    private Singer singer;

    public LaBa(Singer singer) {
        this.singer = singer;
    }
    public void  song(){
        System.out.println("歌手的声音被我放大了");
        this.singer.song();
        System.out.println("歌手停止说话了");
    }
}

 

public class Main {
    public static void main(String[] args) {
        Singer singer=new Singer();
        LaBa laba=new LaBa(singer);
        laba.song();
    }
}

打印的结果和上面的一模一样,那么没有了接口的代理还算不算代理呢

或者干脆我连代理的方法名字song()都和Singer类中的song()方法名不一样。

这样子:

/**
 * 歌手类
 */
public class Singer {
    public void song(){
        System.out.println("歌手在唱歌...");
    }
}

/**
 * 代理类:喇叭(英语单词太难了,怕你们不认识,直接用拼音了)
 */
public class LaBa {
    private Singer singer;

    public LaBa(Singer singer) {
        this.singer = singer;
    }
    public void  labaSong(){
        System.out.println("歌手的声音被我放大了");
        this.singer.song();
        System.out.println("歌手停止说话了");
    }
}


public class Main {
    public static void main(String[] args) {
        Singer singer=new Singer();
        LaBa laba=new LaBa(singer);
        laba.labaSong();
    }
}

这种没有接口,代理类和实际执行类的方法都不一样了,还算不算代理呢?

找找度娘吧:

技术分享图片

 

定义里面并没有规定使用接口和代理方法名一样才叫代理。所以只要实现了一个对象对另一个对象的访问以及方法调用就是代理模式,现在看来我们在代码中随随便便一个对象方法的调用都是一个模式的使用了。

还是回到大家都认可的有接口的静态代理上来吧;

从那个静态代理的例子里面能看出来,我们手动给Singer创建了一个LaBa类;

这种模式在被代理的方法确定的情况下,是能满足需求的;反之,则无法使用静态代理模式了。

相对于静态代理就是动态代理了。

动态代理模式就是用程序来创建代理对象的模式。

JDK动态代理模式:

 

CGLB动态代理模式。

 

java动态代理之究竟如何创建代理对象

原文:https://www.cnblogs.com/guoyansi19900907/p/12592639.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!