1.创建接口UserDao:
package com.huida.demo1; public interface UserDao { public void save(); public void update(); }
2.创建实现接口的类UserDaoImpl:
package com.huida.demo1; public class UserDaoImpl implements UserDao { @Override public void save() { System.out.println("保存用户..."); } @Override public void update() { System.out.println("修改用户..."); } }
3.编写代理对象类:
package com.huida.demo1; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /* * 传一个对象返回一个代理对象 */ public class MyProxyUtils { public static UserDao getProxy(UserDao dao){//这里传的参数为最大的接口,所以凡是它的子类均可传入,范围更大 //使用proxy类生成代理对象 /* * 参数: * loader:类加载器 dao.getClass().getClassLoader * interfaces:接口 子类对象获取它所实现的接口 * h:回调函数 */ UserDao proxy=(UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() { //回调函数:代理对象一执行,invoke方法就会执行 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //System.out.println("aaaaaaaaaa"); //对功能进行增强 if("save".equals(method.getName())){ System.out.println("记录日志..."); } return method.invoke(dao, args); } }); //返回代理对象 return proxy; } }
4.编写测试代码:
package com.huida.demo1; import org.junit.Test; public class demo1 { @Test public void run1(){ UserDao dao=new UserDaoImpl(); dao.save(); dao.update(); System.out.println("-------------------"); //使用工具类获取代理对象 UserDao proxy=MyProxyUtils.getProxy(dao);//MyProxyUtils是UserDao的一个子类 //每调用一次接口里面的方法,就会一次回调代理对象中的方法 proxy.save(); proxy.update(); } }
5.单元测试run1方法,运行结果为:
通过回调函数对函数功能进行了增强,在保存用户之前输出了“记录日志”。