Spring2.5学习4.2_Proxy实现动态代理(目标类实现任意接口)
2015-07-07 16:18
357 查看
原文链接:http://www.cnblogs.com/jeofey/p/7227051.html
[java] view plaincopy
结果:
静态代理的缺点是在代理类中绑定了固定的接口,不利于扩展,动态代理则不然,通过动态代理可以对任何实现某一接口的类进行功能性增强。
在java中动态代理由InvocationHander来实现。
HelloInterface接口
[java] view plaincopy
- package proxy;
- public interface HelloInterface {
- public void sayHello();
- }
[java] view plaincopy
- 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的其他模块进行整合开发时会更有集中性。
结果:
转载于:https://www.cnblogs.com/jeofey/p/7227051.html
相关文章推荐
- Spring2.5学习4.2_Proxy实现动态代理(目标类实现任意接口)
- Spring2.5学习4.2_Proxy实现动态代理(目标类实现随意接口)
- Spring2.5学习4.2_Proxy实现动态代理(目标类实现随意接口)
- 【引用】模拟JDK实现动态代理(自写Proxy类和InvocationHandler接口)
- SSH与SSM学习之Spring12——动态代理之实现
- spring基础学习(六)——用动态代理实现拦截器
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- Spring Dynamic Proxy (AOP动态代理的实现)
- 【Java EE 学习 50】【Spring学习第二天】【使用注解的DI实现】【spring中的继承】【动态代理伪hibernate实现】
- MyBatis学习_动态代理实现CRUD(mybatis接口开发)_优化conf_全局参数设置_别名_类型处理器
- Spring的AOP实现使用的JDK的动态代理必须使用接口
- 黑马程序员--09.动态与代理AOP--06【动态代理实例化的过程升级--目标对象+系统功能的参数化】【实现类似Spring的可配置AOP框架】
- Java基础---Java---基础加强---类加载器、委托机制、AOP、 动态代理技术、让动态生成的类成为目标类的代理、实现Spring可配置的AOP框架
- Java-马士兵设计模式学习笔记-代理模式--动态代理 修改成可以代理任意接口
- Spring 静态代理和动态代理(实现接口)
- 学习Java框架的笔记(Spring AOP)简介、动态代理、基于代理类的AOP实现、AspectJ开发
- Spring 2.5 采用动态代理或cglib来实现aop
- java代理的学习,通过类实现接口来实现代理。proxy来创建动态类,和InvocationHandler接口的实现,和工作原理。
- Spring2.5学习4.1_静态代理实现