关于JDK动态代理的小demo
2017-10-11 10:04
369 查看
JDK动态代理是基于面向接口编程,Spring AOP的实现也是基于此原理,而动态代理的实现则是基于反射机制。动态代理的主要目的就是灵活的将方法的调用与实现之间解耦,同时在目标方法调用的前后加入其他的通知。先看一个小demo: 先写一个系统用户的实体类SysUser
public class SysUser implements Serializable{ private String userId; private String userName; private String userPassword; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPasPord) { this.userPasswo=userPasswd
这里也可以不实现序列化的,是我的项目加了redis所以才这么做。再写一个业务接口:
package com.my.ssm.service; public interface DynamicService { void Proxy(String s); }
再写它的具体实现:
package com.my.ssm.impl; import com.my.ssm.service.DynamicService; public class Dyncmicimpl implements DynamicService { @Override public void Proxy(String s) { System.out.println("动态代理调用::"+s); } }
接下来写动态代理接口InvocationHandler的实现类:
package com.my.ssm.test; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; public class MyDynamicTest implements InvocationHandler { private Object targetObject;//接收代理对象 //创建动态代理类时构造目标对象 public MyDynamicTest(Object object){ this.targetObject = object; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("动态代理前置通知"); method.invoke(targetObject,args); System.out.println("动态代理后置通知"); return null; } }
关于invoke方法的几个参数在这里解释一下: Object proxy是代理对象的实例,Method method是对象的方法,Object [] args是方法的参数集。 再写一个测试类:
package com.my.ssm.test; import com.my.ssm.impl.Dyncmicimpl; import com.my.ssm.service.DynamicService; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Proxy; public class ProxyTest { public static void main(String[] args){ //得到接口的实现 DynamicService dynamicService = new Dyncmicimpl(); //得到动态代理类 InvocationHandler invocationHandler = new MyDynamicTest(dynamicService); //得到动态代理类创建的对象 DynamicService dynamicServiceProxy = (DynamicService) Proxy.newProxyInstance(DynamicService.class.getClassLoader(),new Class[]{DynamicService.class},invocationHandler); //调用代理方法 dynamicServiceProxy.Proxy("动态代理"); } }
运行结果:
动态代理前置通知 动态代理调用::动态代理 动态代理后置通知
相关文章推荐
- 关于java JDK动态代理的浅显理解
- jdk动态代理技术demo(干货)
- Core Java:使用java.lang.reflect实现JDK动态代理的小DEMO
- JDK和Cglib动态代理小demo
- JDK动态代理--Demo
- 关于java中jdk中接口动态代理模式Proxy的剖析
- java代理Demo——JDK动态代理
- 关于jdk动态代理+proxy参数作用的学习总结
- JDK动态代理Demo
- 关于JDK动态代理的理解
- 代理模式-动态代理Demo(JDK自带的动态代理)
- jdk动态代理和cglib代理demo及总结
- 关于JDK动态代理的一点理解
- JDK动态代理中关于InvocationHandler中invoke()方法的调用问题
- 实现动态代理的两种方式介绍+例子demo(JDK、CGlib)
- Spring AOP的底层实现技术---JDK动态代理
- jdk 动态代理简单应用
- jdk的动态代理和CGLIB的区别
- Spring aop 基于JDK动态代理和CGLIB代理的原理以及为什么JDK代理需要基于接口
- java动态代理(JDK和cglib)