动态代理--jdk动态代理

在jdbc中,如果连接需要归还给连接池,那么直接调用close方法即可,但是调用connection.close()是关闭连接,而现在是将连接还回连接池,其原因就是对Connection的close方法进行了增强。

代理模式的作用:

代理对象可以在调用者和目标对象之间起到中介的作用。代理对象可以对目标对象的功能进行增强。

什么是动态代理:

在程序运行的过程中,动态创建出代理对象,我们可以对代理对象进行控制,对其方法进行增强。

动态代理相应的api:

1. Proxy
1. InvocationHandler 接口
4.2.3 动态代理模式的开发步骤
1. 直接创建真实对象
2. 通过 Proxy 类,创建代理对象
3. 调用代理方法
4. InvocationHandler invoke 进行处理
4.2.4 动态代理模式使用
static Object newProxyInstance ( ClassLoader loader , Class [] interfaces , InvocationHandler h )
作用:生成实现指定接口的代理对象
参数说明:
loader 参数:目标对象 ( 被代理对象 ) 的类加载器 , 一般使用代理对象的类加载器
interfaces :目标对象 ( 被代理对象 ) 需要实现的接口数组 , 一般使用代理对象实现的接口数组
h : 具体的代理操作, InvocationHandler 是一个接口,需要传入一个实现了此接口的实现类。
返回值:实现指定接口的代理对象。
1. InvocationHandler 接口
Object invoke ( Object proxy , Method method , Object [] args )
作用:在这个方法中实现对真实方法的增强
参数说明:
proxy :即方法 newProxyInstance () 方法返回的代理对象,该对象一般不要在 invoke 方法中使用。
method : 代理对象调用的方法对象。
args :代理对象调用方法时传递的参数。
返回值:代理对象执行完此方法后的返回值 , 一般使用被代理对象方法的返回值。
4.2.3 动态代理模式的开发步骤
1. 直接创建真实对象
2. 通过 Proxy 类,创建代理对象
3. 调用代理方法
4. InvocationHandler invoke 进行处理
4.2.4 动态代理模式使用
1. Providable 接口
/*
提供商 品的接口
*/
public interface Providable {
// 卖电脑
public abstract void sellComputer ( double price );
// 维修电脑
public abstract void repairComputer ( double price );
}
1. ComputerFactory 目标对象
/*
电脑工厂,真正生产电脑的厂商
*/
public class ComputerFactory implements Providable {
@Override
public void sellComputer ( double price ) {
System . out . println ( " 电脑工厂卖出一台电脑,价格: " + price );
}
@Override
public void repairComputer ( double price ) {
System . out . println ( " 电脑工厂修好一台电脑,价格: " + price );
}
}
1. 调用者,动态生成代理对象
public class Demo05 {
public static void main ( String [] args ) {
// 1. 直接创建真实对象
ComputerFactory computerFactory = new ComputerFactory ();
// 2. 通过 Proxy 类,创建代理对象
Providable proxy = ( Providable ) Proxy . newProxyInstance (
ComputerFactory . class . getClassLoader (),
new Class [] { Providable . class },
new MyInvocationHandler ( computerFactory )
);
// 3. 调用代理方法
proxy . sellComputer ( 5000 );
proxy . repairComputer ( 800 );
}
}
// InvocationHandler 实现类
class MyInvocationHandler implements InvocationHandler {
private ComputerFactory computerFactory ;
public MyInvocationHandler ( ComputerFactory computerFactory ) {
this . computerFactory = computerFactory ;
}
// 4. InvocationHandler invoke 进行处理
@Override
public Object invoke ( Object proxy , Method method , Object [] args ) throws Throwable {
if ( method . getName (). equals ( "sellComputer" )) { // 对于是要增强的方法进行增强
// 代理对象处理卖电脑的方法。
double price = ( double ) args [ 0 ];
double realPrice = price * 0.75 ;
System . out . println ( " 代理商收到: " + price + " 元,实际使用 " + realPrice + " 去电脑工厂买
电脑 " );
computerFactory . sellComputer ( realPrice );
System . out . println ( " 代理商赚到: " + ( price - realPrice ) + " 元钱 " );
return null ;
} else { // 不需要增强的方法直接调用目标对象的方法
return method . invoke ( computerFactory , args );
}
}
}

 4.2.5 动态代理模式小结

1. 什么是动态代理 在程序运行的过程中,动态创建出代理对象。
2. 动态代理使用到的 API Proxy 类的 newProxyInstance(ClassLoader loader, Class[] interfaces,
InvocationHandler h) 方法 InvocationHandler 接口的 invoke(Object proxy, Method method, Object[] args)
方法
3. Proxy.newProxyInstance() 方法的本质 创建了代理对象,代理对象实现了传入的接口。
4. InvocationHandler 接口的作用 调用代理对象的方法就会执行到 InvocationHandler 接口的 invoke 方法。
5. 动态代理使用步骤
1. 直接创建真实对象
2. 通过 Proxy 类,创建代理对象
3. 调用代理方法
4. InvocationHandler invoke 进行处理
6. 代理模式的好处 在不改变目标类的代码情况下, 代理对象 可以对 目标对象 的功能进行 增强
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值