动态代理
来源:互联网 发布:js网页编程 编辑:程序博客网 时间:2024/06/05 08:05
动态代理
1.动态代理类的角色与静态代理的角色相同。
2.动态代理的代理类是动态生成的。
3.实现方式分为两种:基于接口的代理类和基于类的代理类
一个动态代理类一般代表某一类业务(例如日志监控,性能监控等),一个动态代理类可以代理多个类。
实现方法:
1.定义一个ProxyInvocationHandler类实现接口InvocationHandler
2.把真实类传入给代理类
3.重写函数invoke,并可以在其中添加执行自定义代码
4.获取代理类
代理类
package com.dynamicproxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 17:30 */public class ProxyInvocationHandler implements InvocationHandler { private Object target;//目标类-->真实类 public ProxyInvocationHandler(Object target) { this.target = target; } /** * 获取代理类 * @return */ public Object getProxy() { return Proxy.newProxyInstance(this.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } /** * 重写调用函数,并添加自定义代码 * @param proxy * @param method * @param args * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log(method.getName()); Object result = method.invoke(target, args); return result; } /** * 自定义日志输出函数 * @param methodName */ private void log(String methodName) { System.out.println("Execute method : " + methodName); }}
接口类
package com.dynamicproxy;import com.duoduo.User;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 17:32 */public interface IUserDao { void add(User user); void update(User user);}
接口实现类
package com.dynamicproxy;import com.duoduo.User;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 21:00 */public class UserDaoImpl implements IUserDao { @Override public void add(User user) { System.out.println("add user"); } @Override public void update(User user) { System.out.println("update user"); }}
测试类
package com.dynamicproxy;import com.duoduo.User;/** * @author Duoduo * @version 1.0 * @date 2017/5/13 21:01 */public class Test { public static void main(String[] args) { IUserDao userDao = new UserDaoImpl(); ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler(userDao); IUserDao proxy = (IUserDao)proxyInvocationHandler.getProxy(); proxy.add(new User()); }}
测试结果
Execute method : addadd user
0 0
- 代理-->静态代理&动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- 动态代理
- MVVM 模式
- git分支提交
- n皇后问题和2n皇后问题
- 黑色C语言-----位域
- 在二叉查找树中插入节点
- 动态代理
- 编译安装php5.6.30
- 解决mysql本地可访问,远程无法访问的问题 Host is not allowed to connect to this MySQL server
- Self & Super
- GetLastError 返回值大全
- 变形实例
- [Spring实战系列]
- C#多线程Lock
- 对于JdbcTemplate#queryForObject()的使用