代理模式(静态代理以及动态代理)

本文详细介绍了代理模式中的静态代理和动态代理两种实现方式。静态代理在程序运行前即已定义好代理类,而动态代理则是在运行期间动态生成代理类。文章通过示例代码解释了这两种代理的具体实现过程,并探讨了它们的应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

前言

一、静态代理的实现模式?

二、动态代理

1.动态代理概念理解

2.Java 动态代理的作用是什么?

3.代理模式

 


前言

代理模式分为两种,一种是静态代理模式,一种是动态代理模式。静态代理模式:在程序运行之前需要写好代理类动态代理模式:在程序运行期间动态生成代理类


 

一、静态代理的实现模式?

首先创建一个接口(JDK代理都是面向接口的),然后创建具体实现类来实现这个接口,在创建一个代理类同样实现这个接口,不同之处在于,具体实现类的方法中需要将接口中定义的方法的业务逻辑功能实现,而代理类中的方法只要调用具体类中的对应方法即可,这样我们在需要使用接口中的某个方法的功能时直接调用代理类的方法即可,将具体的实现类隐藏在底层。

      第一步:定义接口Iuser.java

package Test2;

public interface Iuser {
    void eat(String s);
}

    第二步:创建具体实现类UserImpl.java

package Test2;

public class UserImpl implements Iuser {

	@Override
	public void eat(String s) {
		System.out.println("我要吃"+s);
	}
}

      第三步:创建代理类UserProxy.java 

package Test2;

public class UserProxy implements Iuser {

	private Iuser user = new UserImpl();

	@Override
	public void eat(String s) {
		System.out.println("静态代理前置内容");
		user.eat(s);
		System.out.println("静态代理后置内容");
	}
}

      第四步:创建测试类ProxyTest.java 

package Test2;

public class ProxyTest {
	public static void main(String[] args) {
		UserProxy proxy = new UserProxy();
		proxy.eat("苹果");
	}
}

二、动态代理

1.动态代理概念理解

动态代理是一种方便运行时动态构建代理、动态处理代理方法调用的机制,很多场景都利用类似机制做到的,比如用来包装RPC调用、面向切面的变成(AOP)

实现动态代理的方式很多,比如JDK自身提供的动态代理,就是主要利用了下面提到的反射机制。还有其他的实现方式,比如利用更高性能的字节码操作机制,类似ASM、cglib(基于ASM)、Javaassist 等。

2.Java 动态代理的作用是什么?

主要用来做方法的增强,让你可以在不修改源码的情况下,增强一些方法,在方法执行前后做任何你想做的事情,甚至根本不去执行这个方法,因为在InvocationHandler的invoke方法中,可以直接获取政治调用方法对应的Method对象,具体应用的话,可以添加调用日志,做事务控制等。

动态代理是设计模式当中代理模式的一种。(代理设计模式:为其他对象提供一种代理以控制这个对象的访问)

 Java的动态代理是基于java.lang.reflect.Proxy、java.lang.reflect.invocationHandler两个类来完成的,使用了反射机制。

3.代理模式

通过代理模式默默的解决一些与业务无关的问题,比如远程、安全、事务、日志、资源关闭等,让应用开发者可以只关注他的业务。

----静态代理:事先写好代理类,可以手工编写,也可以工具生成。缺点是每个业务类都要对应一个代理类,非常不灵活。

----动态代理:运行时自动生成代理对象。缺点是生成代理对象和调用代理方法都要额外花费时间。

----JDK动态代理:基于Java 反射机制实现,必须要了解接口的业务类型才能用这种办法生成代理对象。新版本也开始结合ASM机制。

----cglib动态代理: 基于ASM机制实现,通过生成业务类的子类作为代理类。 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值