java静态代理

硅谷探秘者 1663 0 0

java静态代理示例

package club.jiajiajia.test.staticproxy;

public interface BuyHouse {
    void buyHosue();//买房子
}
package club.jiajiajia.test.staticproxy;

public class BuyHouseImpl implements BuyHouse {

    @Override
    public void buyHosue() {
        System.out.println("买房子");
    }
}
package club.jiajiajia.test.staticproxy;

public class BuyHouseProxy implements BuyHouse {

    private BuyHouse buyHouse;

    public BuyHouseProxy(final BuyHouse buyHouse) {
        this.buyHouse = buyHouse;
    }
    @Override
    public void buyHosue() {
        System.out.println("买房前准备");
        buyHouse.buyHosue();
        System.out.println("买房后装修");
    }
}
@Test
	public void test1(){
		BuyHouse bh=new BuyHouseImpl();//被代理对象
		BuyHouse bh2=new BuyHouseProxy(bh);//代理对象
		bh2.buyHosue();
		System.out.println();
		System.out.println("bh 对象是否是 BuyHouse 的实例:"+(bh instanceof BuyHouse));
		System.out.println("bh 对象是否是 BuyHouseImpl 的实例:"+(bh instanceof BuyHouseImpl));
		System.out.println("bh2 对象是否是 BuyHouse 的实例:"+(bh2 instanceof BuyHouse));
		System.out.println("bh2 对象是否是 BuyHouseImpl 的实例:"+(bh2 instanceof BuyHouseImpl));
	}

对于静态代理较为简单,不多说

/**
	 * 静态代理
	 * 所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。
	 * 优点:业务类只需要关注业务逻辑本身,保证了业务类的重用性。这是代理的共有优点。 
	 * 缺点: 
	 * 1)代理对象的一个接口只服务于一种类型的对象,如果要代理的方法很多,势必要为每一种方法都进行代理,静态代理在程序规模稍大时就无法胜任了。 
	 * 2)如果接口增加一个方法,除了所有实现类需要实现这个方法外,所有代理类也需要实现此方法。增加了代码维护的复杂度。
	 */

重点:

所谓静态也就是在程序运行前就已经存在代理类的字节码文件,代理类和委托类的关系在运行前就确定了。

这点和jdk动态代理,和cglib动态代理有很大的区别


运行打印内容:

买房前准备
买房子
买房后装修

bh 对象是否是 BuyHouse 的实例:true
bh 对象是否是 BuyHouseImpl 的实例:true
bh2 对象是否是 BuyHouse 的实例:true
bh2 对象是否是 BuyHouseImpl 的实例:false


猜你喜欢
linux系统 4710 方案一:一般配置方案二:访问某个域名时资源文件方案一:一般配置  如果以html、htm、gif、jpg、jpeg、bmp、png、ico、txt、js、css结尾的资源,均由nginx处
weblog 2822 前言 好久就开始关注cglib动了,但是到今天才算是有点搞明白~cglib动底层用到了asm等字节码操作框架。不懂的可以先百度百度asm是干啥的,在这里也提供一些文章,但是可能比较深入
java基础 1926 初步探究cglib动的原之前我们说了一下jdk动的原http://www.jiajiajia.club/weblog/blog/artical/60本章说一下cglib动,做个
java基础 1384 初步探究jdk动1.先看码实现packageclub.jiajiajia.test.staticproxy;publicinterfaceBuyHouse{voidbuyHosue
java springboot 1054 涉及知识点:java编译,java反射,io流,java文件操作,输入输出重定向,多线程与线程安全,mysql数据库设计等,解起来难度较高。下面是我自己设计的几个问题,和一些测试数据。排序问题
其他 2617 1.动编译技术从JDK1.6开始引入了用Java码重写的编译器接口,使得我们可以在运行时编译Java源码,然后用类加载器进行加载,让Java语言更具灵活性,能够完成许多高级的操作。2.本次要实现
ASM,java基础 384   关于cglib的概念和原以及常用api,请参考:初步探究cglib动的原:http://www.jiajiajia.club/blog/artical/yjw520
java基础 3414 方法不能new内部类的实例对象解析:我们知道非内部类有一个特点就是可以访问外部类对象的非属性,而外部类的的属性只有再创建对象以后才有,而方法属于类,不属于对象,所以再main方法执行
归档
2018年11月  12 2018年12月  33 2019年01月  28 2019年02月  28 2019年03月  32 2019年04月  27 2019年05月  33 2019年06月  6 2019年07月  12 2019年08月  12 2019年09月  21 2019年10月  8 2019年11月  15 2019年12月  25 2020年01月  9 2020年02月  5 2020年03月  16 2020年04月  4 2020年06月  1 2020年07月  7 2020年08月  13 2020年09月  9 2020年10月  5 2020年12月  3 2021年01月  1 2021年02月  5 2021年03月  7 2021年04月  4 2021年05月  4 2021年06月  1 2021年07月  7 2021年08月  2 2021年09月  8 2021年10月  9 2021年11月  16 2021年12月  14 2022年01月  7 2022年05月  1 2022年08月  3 2022年09月  2
标签
算法基础 linux 前端 c++ 数据结构 框架 数据库 计算机基础 储备知识 java基础 ASM 其他 深入理解java虚拟机 nginx git 消息中间件 搜索 maven redis docker dubbo vue 导入导出 软件使用 idea插件 协议 无聊的知识 jenkins springboot mqtt协议 keepalived minio mysql ensp 网络基础
目录
余生别太较劲,放过自己 才会幸福。