动态代理学习总结二
来源:互联网 发布:网络赚钱是真的吗 编辑:程序博客网 时间:2024/05/18 20:08
(1)定义接口,此接口是被代理对象实现的接口
public interface UserDAO {public void save(User u);}
(2)被代理类,实现了上面定义的接口,对内部的save方法进行了重写,我们要在这个被代理类的前面或者后面加一些其他的逻辑,而该程序本身只有class文件,改不了源码
public class UserDAOImpl implements UserDAO{public void save(User u) {System.out.println("user saved!");}}
(3)假如要在上面类的后面加上一些日志内容,那么首先要写一个代理类实现InvocationHandler
import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;public class LogInterceptor implements InvocationHandler{private Object target;public LogInterceptor(Object target) {this.target = target;}public void beforeMethod() {System.out.println("save start");}@Overridepublic Object invoke(Object proxy, Method m, Object[] args)throws Throwable {beforeMethod();m.invoke(target,args);//调用target对象的m方法return null;}}
(4)客户端调用:
import static org.junit.Assert.*;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Proxy;import org.junit.Test;public class UserServiceTest {@Testpublic void testAdd() throws Exception {BeanFactory factory = new ClassPathXmlApplicationContext();UserService service = new UserService();UserDAO userDAO = (UserDAO) factory.getBean("u");service.setUserDAO(userDAO);User u = new User();service.add(u);}@Testpublic void testProxy() {UserDAOImpl userDAO = new UserDAOImpl();LogInterceptor h = new LogInterceptor(userDAO);UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(UserDAO.class.getClassLoader(), new Class[]{UserDAO.class}, h);//和被代理对象用同一个classloader,或者userDAO.getClass().getClassLoader();第二个参数指产生的被代理对象应该实现那些接口,本类只实现了UserDAO,也可以写成,userDAO.getClass().getInterfaces()? 第三个是: 当我产生代理之后我调用代理里面的方法之后用哪一个Handler进行处理userDAOProxy.save(new User());}}
0 0
- 动态代理学习总结二
- 学习动态代理的总结
- 动态代理的学习总结
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Spring学习总结(二)——静态代理、JDK与CGLIB动态代理、AOP+IoC
- Java动态代理学习文章(二)
- 黑马程序员 动态代理学习笔记二
- Mybatis学习总结(二).Mybatis普通方式实现CRUD及动态代理方式实现CRUD
- java的动态代理学习总结
- JDK动态 代理 & CgLib 学习总结
- Java基础学习总结(109)——Jdk动态代理和cglib动态代理总结
- 动态代理------二
- java动态代理(二)
- java动态代理总结
- 动态代理总结
- 动态代理总结
- 动态代理总结
- Java动态代理总结
- eclipse的快捷键
- 修改Odoo(OpenERP) Server的默认端口8069
- Java泛型入门
- Oracle的优化器的RBO和CBO方式
- Java并发测试扩展插件JunitPerf的使用
- 动态代理学习总结二
- 非著名程序员的出路
- Windows 10系统最低配置要求
- 开发包含folder的TAB页FORM
- Android 4.0的图形硬件加速及绘制技巧(1)
- 安卓 字符串操作 split 里面的分隔符 是需要转义的
- 如何适配iPhone6及Plus
- 各种浏览器内核的区别
- 适配ios6 Assertion failure in -[UISearchDisplayController setActive:animated:]