Spring2.5学习4.2_Proxy实现动态代理(目标类实现随意接口)
2024-09-04 05:55:20
静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理能够对不论什么实现某一接口的类进行功能性增强。
在java中动态代理由InvocationHander来实现。
HelloInterface接口
- package proxy;
- public interface HelloInterface {
- public void sayHello();
- }
实现HelloInterface接口的类HelloInterfaceImpl
- package proxy;
- public class HelloInterfaceImpl implements HelloInterface {
- @Override
- public void sayHello() {
- System.out.println("Hello xianjj");
- }
- }
proTest类实现了InvocationHandler类
package proxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
// 实现InvocationHandler接口
public class proTest implements InvocationHandler { Object anyObject; // 申明bind方法
public Object bind (Object anyObject){
this.anyObject = anyObject;
return Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
}
// 重写invoke方法
@Override
public Object invoke(Object arg0, Method arg1, Object[] args)
throws Throwable {
Object returnObject = null;
System.out.println("动态代理開始");
returnObject = arg1.invoke(anyObject, args);
System.out.println("动态代理结束");
return returnObject;
} public static void main(String[] args) {
proTest proTest = new proTest();
HelloInterface helloInterfaceReturn = (HelloInterface)proTest.bind(new HelloInterfaceImpl());
helloInterfaceReturn.sayHello();
}
}
在main方法中调用proTest对象的bind绑定方法将一个实现类与一个动态代理进行绑定。动态代理主要由下面代码来实现
Proxy.newProxyInstance(anyObject.getClass().getClassLoader(), anyObject.getClass().getInterfaces(), this);
将输入的anyObject对象与接口进行动态关联。这样就能够避免静态接口固定的缺陷了,动态代理由原来的静态代理面向接口转向动态代理面向实现类,这样设计的出发点不是对接口,而是动态的取的接口。软件的灵活性大大的提高。
当调用被代理的HelloInterfaceImpl类实例的方法时,系统将转到包括代理类proTest的InvocationHandler的invoke方法中运行对应的代码,动态代理的过程结束。
public class proTest implements InvocationHandler类不在服务于某一个接口。静态代理和动态代理都是针对于sayHello()方法进行增强,不支持field字段级的增强。
Spring觉得那已经在破坏面向对象编程的结构,所以支持方法的增强是再合适不的,并且与Spring的其它模块进行整合开发时会更有集中性。
结果:
最新文章
- 解决magento后台无法登陆/登陆没有反应的方法
- python 生成 xml文件 属性的顺序问题
- 字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略
- TCP的粘包现象
- 一句命令快速合并 JS、CSS
- 窥探算法之美妙——寻找数组中最小的K个数&;python中巧用最大堆
- c++ timer基于win消息队列
- 使用片上XRAM需要进行的初始化
- nginx自定义模块编写-根据post参数路由到不同服务器
- Oracle字符编码
- 性能测试工具 - Apache JMeter (安装)
- opencv之从视频帧中截取图片
- SQLServer:无法生成 SSPI 上下文(Cannot generate SSPI context)
- Python paramik
- Java 自定义hashmap和hashtable的key注意哪些问题
- 数据泵导出报ORA-01555 ORA-22924
- kettle数据库连接使用变量
- 消息队列系统 -- RabbitMQ
- C++的开源跨平台日志库glog学习研究(二)--宏的使用
- Icingaweb2监控oracle数据库的安装配置流程
热门文章
- Xamarin XAML语言教程模板视图TemplatedView(二)
- 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)
- java.lang.NegativeArraySizeException
- [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
- [BZOJ2216]Lightning Conductor
- 【容斥原理】Codeforces Round #428 (Div. 2) D. Winter is here
- FIREDAC用于LINUX报头文件FireDAC.VCLUI.Wait找不到
- 2011年排名前七位的Linux操作系统。
- Android内存优化10 内存泄漏常见情况1 静态泄漏
- SQL locate()函数