静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理能够对不论什么实现某一接口的类进行功能性增强。

在java中动态代理由InvocationHander来实现。

HelloInterface接口

[java] view
plain
copy

  1. package proxy;
  2. public interface HelloInterface {
  3. public void sayHello();
  4. }

实现HelloInterface接口的类HelloInterfaceImpl



[java]
 view
plain
copy

  1. package proxy;
  2. public class HelloInterfaceImpl implements HelloInterface {
  3. @Override
  4. public void sayHello() {
  5. System.out.println("Hello xianjj");
  6. }
  7. }

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的其它模块进行整合开发时会更有集中性。

结果:

最新文章

  1. 解决magento后台无法登陆/登陆没有反应的方法
  2. python 生成 xml文件 属性的顺序问题
  3. 字符串反混淆实战 Dotfuscator 4.9 字符串加密技术应对策略
  4. TCP的粘包现象
  5. 一句命令快速合并 JS、CSS
  6. 窥探算法之美妙——寻找数组中最小的K个数&python中巧用最大堆
  7. c++ timer基于win消息队列
  8. 使用片上XRAM需要进行的初始化
  9. nginx自定义模块编写-根据post参数路由到不同服务器
  10. Oracle字符编码
  11. 性能测试工具 - Apache JMeter (安装)
  12. opencv之从视频帧中截取图片
  13. SQLServer:无法生成 SSPI 上下文(Cannot generate SSPI context)
  14. Python paramik
  15. Java 自定义hashmap和hashtable的key注意哪些问题
  16. 数据泵导出报ORA-01555 ORA-22924
  17. kettle数据库连接使用变量
  18. 消息队列系统 -- RabbitMQ
  19. C++的开源跨平台日志库glog学习研究(二)--宏的使用
  20. Icingaweb2监控oracle数据库的安装配置流程

热门文章

  1. Xamarin XAML语言教程模板视图TemplatedView(二)
  2. 【uva 10294】 Arif in Dhaka (First Love Part 2) (置换,burnside引理|polya定理)
  3. java.lang.NegativeArraySizeException
  4. [BZOJ3167][P4099][HEOI2013]SAO(树形DP)
  5. [BZOJ2216]Lightning Conductor
  6. 【容斥原理】Codeforces Round #428 (Div. 2) D. Winter is here
  7. FIREDAC用于LINUX报头文件FireDAC.VCLUI.Wait找不到
  8. 2011年排名前七位的Linux操作系统。
  9. Android内存优化10 内存泄漏常见情况1 静态泄漏
  10. SQL locate()函数