1.建立一个接口类和实现类
package cn.mldn.dao; import cn.mldn.vo.User; import java.util.List; /** * Created by wq on 2017/9/18. */ public interface IUserDAO { public void doCreate(User vo) throws Exception; public void doUpdate(User vo) throws Exception; public void doRemove(String name) throws Exception; public User findByName(String name) throws Exception; public List<User> findAll() throws Exception; }
package cn.mldn.dao.impl; import cn.mldn.dao.IUserDAO; import cn.mldn.vo.User; import java.util.List; /** * Created by wq on 2017/9/18. */ public class UserDAOImpl implements IUserDAO { @Override public void doCreate(User vo) throws Exception { System.out.println("【增加数据:doCreate】"+vo); } @Override public void doUpdate(User vo) throws Exception { System.out.println("【修改数据:doUpdate】"+vo); } @Override public void doRemove(String name) throws Exception { System.out.println("【删除数据:doRemove】"+name); } @Override public User findByName(String name) throws Exception { System.out.println("【查询数据:findByName】"+name); return null; } @Override public List<User> findAll() throws Exception { System.out.println("【查询数据:findAll】"); return null; } }2.建立代理类
package cn.mldn.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Created by wq on 2017/9/23. */ public class DAOProxy implements InvocationHandler{ private Object target; //要代理的对象信息 //需要由系统生产一个指定接口的代理类对象 public Object bind(Object target){ this.target=target; //返回与当前传入对象结构相同的代理对象 return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //取得当前执行的方法的名称 this.log(method.getName()); Object retObj = method.invoke(this.target,args); //如果是更新则进行事物处理 if (method.getName().matches("do[a-zA-Z0-9]+")){ this.commit(); } return retObj; } public void log(String methodName){ System.out.println("进行日志记录 ,方法:"+methodName); } public void commit(){ System.out.println("事务提交。"); } }
3.建立代理测试类
package cn.mldn.test; import cn.mldn.dao.IUserDAO; import cn.mldn.dao.impl.UserDAOImpl; import cn.mldn.dao.proxy.UserDAOProxy; /** * Created by wq on 2017/9/17. */ public class ProxyDemo { public static void main(String[] args ) throws Exception { IUserDAO dao=(IUserDAO) new UserDAOProxy().bind(new UserDAOImpl()); dao.doCreate(null); dao.findByName("hello"); } }
传入的是接口,如果没有接口则会出现错误 所以用cglib包进行设计
以下是:
代理测试类
package cn.mldn.test; import net.sf.cglib.proxy.Enhancer; import net.sf.cglib.proxy.MethodInterceptor; import net.sf.cglib.proxy.MethodProxy; import java.lang.reflect.Method; /** * Created by wq on 2017/9/24. */ class Hello{ public void print(){ System.out.println("中午了,肚子饿了吧?听晕了不"); } } public class CGLIBProxyDemo { public static void main(String[] args ) throws Exception { final Hello hello = new Hello(); //代理类对象 Enhancer enhancer = new Enhancer(); //为代理类设置一个父类 enhancer.setSuperclass(Hello.class); enhancer.setCallback(new MethodInterceptor() { @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { System.out.println("******************"); return method.invoke(hello,objects); } }); //返回代理类对象 Hello temp= (Hello) enhancer.create(); temp.print(); } }
成功:本案例导入的包为cglib-2.1.3.jar和asm.jar 已经上传自行下载