使用JDK中的InvocationHandler、Proxy实现动态代理
来源:互联网 发布:网络教育公共课统考 编辑:程序博客网 时间:2024/05/19 02:24
动态代理(Dynamic Proxy)
一、切面编程(在方法前后加上一些逻辑,如下:在save(User user)方法前后加逻辑)
准备工作:
public class UserDAOImpl {public void save(User user) {System.out.println("user saved!");}}
1、实现方法一:直接在方法里面逻辑前后进行添加
public class UserDAOImpl implements UserDAO {public void save(User user) {System.out.println("user start"); //在方法前添加逻辑System.out.println("user saved!");}}
2、实现方法二:使用继承进行添加
public class UserDAOImpl2 extends UserDAOImpl {@Overridepublic void save(User user) {System.out.println("user start"); //在方法前添加逻辑super.save(user);}}
3、实现方法三:使用接口进行添加
添加接口UserDAO
public interface UserDAO {public void save(User user);}
让UserDAOImpl继承接口
public class UserDAOImpl implements UserDAO {public void save(User user) {System.out.println("user saved!");}}
让UserDAOImpl2继承接口
public class UserDAOImpl2 implements UserDAO {private UserDAOImpl userDAOImpl = new UserDAOImpl();public void save(User user) {System.out.println("user start"); //在方法前添加逻辑userDAOImpl.save(user);}}
小总结:三种方法中,使用接口和组合最为合适,但是如果要添加逻辑的方法十分多,而且因继承接口而形成的结构十分复杂的时候,可以使用动态代理来帮助实现。
二、使用动态代理添加逻辑
将所需要添加的逻辑封装成一个类,让其继承InvocationHandler接口
public class LogInterceptor implements InvocationHandler {private Object target; //需要添加逻辑的对象public LogInterceptor(Object target) {this.target = target;}public void log(Method m) {System.out.println(m.getName() + " start");}/* * proxy 代理对象 * method 代理对象要执行的方法 * args 所需执行方法的参数 */public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {log(method); //在执行方法前添加逻辑method.invoke(target , args);return null;}}
使用Proxy获得代理对象,代理对象与被代理对象要实现同样的接口
public class TestProxy {/* * userDAO 要代理的对象,实现了UserDAO接口 * li 给代理添加逻辑的类 * proxy 通过Proxy的静态方法生成的代理对象 * 代理对象与被代理的对象的ClassLoader要一样 * 通过传入的参数,实现与代理对象同样的接口 */public void testProxy() {UserDAO userDAO = new UserDAOImpl();LogInterceptor li = new LogInterceptor(userDAO); UserDAO proxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), new Class[]{UserDAO.class}, li);proxy.save(new User());proxy.delete();}}
- 使用JDK中的InvocationHandler、Proxy实现动态代理
- JDK使用InvocationHandler和Proxy实现动态代理
- JDK动态代理proxy,InvocationHandler
- jdk proxy invocationhandler (jdk动态代理)
- JAVA JDK 动态代理 proxy invocationHandler
- 使用反射生成JDK动态代理---使用Proxy和InvocationHandler创建动态代理
- 动态代理 Proxy InvocationHandler
- 动态代理proxy ,InvocationHandler
- 动态代理 Proxy InvocationHandler
- JAVA动态代理实现 Proxy InvocationHandler
- Java 基于JDK中的InvocationHandler实现动态代理
- 使用Proxy和InvocationHandler创建动态代理
- 使用JDK中的Proxy技术实现AOP功能[动态代理]
- 使用JDK中的Proxy技术来实现动态代理
- 【引用】模拟JDK实现动态代理(自写Proxy类和InvocationHandler接口)
- JDK的动态代理深入解析(Proxy,InvocationHandler)
- JDK的动态代理深入解析(Proxy,InvocationHandler)
- JDK的动态代理深入解析(Proxy,InvocationHandler)
- 排序方法
- Windows 环境下文件批量操作
- 循环队列的实现
- 字符串功能实现
- 使用Jdom进行简单的XML解析
- 使用JDK中的InvocationHandler、Proxy实现动态代理
- 排序二叉树
- Spring IOC(DI)模拟
- Spring DBCP 数据库连接池配置
- Spring IOC XML Configuration
- Spring IoC Annotation 的简单使用
- Spring AOP 简单使用
- FreeBSD下安装MySQL
- java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider