Java动态代理实现(简单AOP实现)
2015-08-07 14:19
716 查看
[align=center][/align] 本文介绍了简单Aop实现的方法,意在抛砖引玉。 首先是简单的Aspect接口 Java代码 package org.aspect; /** * 切面接口 */ public interface Aspect { /** * 事先执行 */ public void doBefore(); /** * 事后执行 */ public void doAfter(); } 然后是代理工厂 Java代码 package org.aspect; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List; /** * 代理工厂类 */ public class DynamicProxyFactory { /** * 私有构造方法 */ private DynamicProxyFactory() {} /** * 工厂方法 * * @param instance 代理目标类实例对象 * @param aspect 切面对象 */ public static Object newInstance(Object instance, Aspect aspect) { List<Aspect> aspectList = new ArrayList<Aspect>(); aspectList.add(aspect); return newInstance(instance, aspectList); } /** * 工厂方法 * * @param instance 代理目标类实例对象 * @param aspectList 切面集合 */ public static Object newInstance(Object instance, List<Aspect> aspectList) { SimpleInvocationHandler hander = new SimpleInvocationHandler(); hander.setAspectList(aspectList); hander.setSource(instance); return Proxy.newProxyInstance(instance.getClass().getClassLoader(), instance.getClass().getInterfaces(), hander); } } 最后是代理执行类 Java代码 package org.aspect; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.util.List; /** * 代理委托接口实现 */ public class SimpleInvocationHandler implements InvocationHandler { private Object source = null; private List<Aspect> aspectList = null; public Object getSource() { return source; } public void setSource(Object source) { this.source = source; } public List<Aspect> getAspectList() { return aspectList; } public void setAspectList(List<Aspect> aspectList) { this.aspectList = aspectList; } /** * 委托方法 * * @param proxy 代理对象 * @param method 代理方法 * @param args 方法参数 */ public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { for (Aspect aspect : aspectList) { aspect.doBefore(); } Object retObj = method.invoke(getSource(), args); for (int index = aspectList.size() - 1; index >= 0; index--) { aspectList.get(index).doAfter(); } return retObj; } } 测试代码 Java代码 public interface Student { public void sayHello(); } import org.aspect.Aspect; public class StudentAspectOne implements Aspect { @Override public void doAfter() { System.out.println("do After One"); } @Override public void doBefore() { System.out.println("do Before One"); } } import org.aspect.Aspect; public class StudentAspectTwo implements Aspect{ @Override public void doAfter() { System.out.println("do After Two"); } @Override public void doBefore() { System.out.println("do Before Two"); } } public class StudentImpl implements Student { @Override public void sayHello() { System.out.println("Student"); } } import java.util.ArrayList; import java.util.List; import org.aspect.Aspect; import org.aspect.DynamicProxyFactory; public class Test { public static void main(String[] args) { List<Aspect> aspectList = new ArrayList<Aspect>(); aspectList.add(new StudentAspectOne()); aspectList.add(new StudentAspectTwo()); Student s = (Student)DynamicProxyFactory.newInstance(new StudentImpl(), aspectList); s.sayHello(); } } 执行Test,控制台返回 do Before One do Before Two Student do After Two do After One |
相关文章推荐
- eclipse从数据库逆向生成Hibernate实体类
- 看懂java的class文件(字节码)(好)
- Java开发中的23种设计模式详解
- Java线程的5种状态及切换(透彻讲解)
- Spring3+Hibernate3(Jpa) 配置多个数据源的解决方案(基于注解)
- java基础知识:java方法传参机制
- java struts2 导出xml文件
- Maven项目的jetty调试
- Java数组与内存控制
- Java初学遇到的问题
- Java基础查漏补缺
- Java 访问控制符详解
- eclipse 找不到Courier New 样式
- Java内部类访问局部变量时的final问题
- Java栈和局部变量操作
- 简易Java爬虫制作
- Java高级-对象的完全复制
- spring之Ioc机制
- ssh之spring
- springMVC找不到JS等文件