Java动态代理
来源:互联网 发布:龙信数据有限公司 编辑:程序博客网 时间:2024/06/06 07:08
动态代理在程序运行时由反射机制动态创建而成。为其他对象创建一个代理以控制对这个对象的访问。
实现动态代理:
LogInterceptor.java
package com.spring.aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class LogInterceptor2 implements InvocationHandler{ private Object target; public Object newProxyInstance(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } public void beforeMethod(Method m){ System.out.println(m.getName()+" start"); } @Override public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { beforeMethod(m); m.invoke(target, args); return null; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; }}
TestUserService.java
@Test public void testProxy(){ //UserDAO userDAO = new UserDAOImpl(); LogInterceptor2 li2 = new LogInterceptor2(); //li2.setTarget(userDAO); //UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li2); UserDAO userDAOProxy =(UserDAO)li2.newProxyInstance(new UserDAOImpl()); userDAOProxy.save(new User()); }
或者
LogInterceptor.java
package com.spring.aop;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class LogInterceptor2 implements InvocationHandler{ private Object target; // public Object newProxyInstance(Object target) { // this.target = target; // return Proxy.newProxyInstance(target.getClass().getClassLoader(), // target.getClass().getInterfaces(), this); // } public void beforeMethod(Method m){ System.out.println(m.getName()+" start"); } @Override public Object invoke(Object proxy, Method m, Object[] args) throws Throwable { beforeMethod(m); m.invoke(target, args); return null; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; }}
TestUserService.java
@Test public void testProxy(){ UserDAO userDAO = new UserDAOImpl(); LogInterceptor2 li2 = new LogInterceptor2(); li2.setTarget(userDAO); UserDAO userDAOProxy =(UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li2); //UserDAO userDAOProxy =(UserDAO)li2.newProxyInstance(new UserDAOImpl()); userDAOProxy.save(new User()); }
Proxy
Proxy类中的newProxyInstance(ClassLoader loader, Class< ?>[] interface, InvocationHandler h)方法中的三个参数
ClassLoader loader:类加载器(产生代理对象的ClassLoader)
Class< ?>[] interface:产生的代理对象实现的接口
InvocationHandler h:使用哪个Handler进行处理
动态代理产生过程
jdk中的动态代理
Proxy会产生一个代理对象(userDAOProxy),这个对象根据要实现的接口类产生。接口中有哪些方法,产生的代理中就有哪些方法。
代理中的方法如何实现
代理中的方法在调用时,会把代理自身,实现的方法以及参数传到invoke中。invoke方法首先执行自己的逻辑,然后会调被代理对象的method。这样就实现了动态代理。
模拟实现过程:
class &Proxy4 implements UserDAO{ save(User u){ Method m = UserDAO.getClass().getMethod(); li.invoke(this,m,u); }}
阅读全文
1 0
- Java 代理,动态代理
- [Java] Java 动态代理
- java代理及动态代理
- java代理模式--动态代理
- Java静态代理、动态代理
- Java 代理之 动态代理
- Java 代理与动态代理
- java静态代理,动态代理
- 代理模式&java动态代理
- Java代理与动态代理
- Java静态代理动态代理
- JAVA代理模式--动态代理
- java 代理和动态代理
- JAVA动态代理 代理模式
- Java动态代理--jdk代理
- Java动态代理--cglib代理
- Java 代理与动态代理
- java代理模式-动态代理
- TCP三次握手和四次挥手
- Java关键字及作用解释
- Excel 技巧百例:字符串截取函数的经典组合示例
- 用 Android studio 查看源码细节
- 初学数据结构--读《数据结构》(人民邮电出版社)笔记
- Java动态代理
- 设计模式之建造者模式
- (二)Linix下多文档的数据结构顺序表实现
- 文件的读写(I/O)操作总结(二)——读取Assets中的文件数据
- 怎样查看MySql数据库物理文件存放位置
- 最近在搞react redux react-router等,
- awk 实例
- Inkscape矢量抠图教程
- springmvc拦截器和Java过滤器的关系