写技术博客挺累的啊....总结了一下午总算是出来了~废话不多说,贴代码吧~
名词解释:
动态代理:既指类的代理对象是动态生成的,而不是有程序员预先编写好的,这里利用java反射包中的类Proxy,核心代码如下:
通过 Proxy.getProxyClass(ClassLoader loader, Class<?>... interfaces) 如: Object target; Class clazz = Proxy.getClass( target.getClass().getClassLoader(), target.getClass().getInterfaces() ); Object proxyObj = clazz.newInstance(); 或者直接通过: Proxy.newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 例如: Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new MyInvocationHandler()); 模拟AOP和动态代理代码片段:
package com.java.enhance; import java.io.InputStream; import java.util.List; /** * 测试AOP以及动态代理 * * @author zhuoni * */ public class DynamicProxyDemo { public static void main(String[] args) throws Exception { //1.读取资源文件 InputStream inputStream = DynamicProxyDemo.class.getResourceAsStream("bean.properties"); //2.创建beanFactory实例 BeanFactory beanFactory = new BeanFactory(inputStream); List bean = (List)beanFactory.getBean("bean"); bean.add("aa"); } } 运行结果: 在目标类方法执行之前要做的内容~ 执行目标方法~ 在目标类方法执行之后要做的内容~ 结论: 当我们获取代理类的时候,就会生成对应的代理对象返回 相关类以及接口代码: package com.java.enhance; import java.io.IOException; import java.io.InputStream; import java.util.Properties; /** * Bean工厂类 * * @author zhuoni * */ public class BeanFactory { private Properties prop = new Properties(); public BeanFactory(InputStream inStream){ try { prop.load(inStream); } catch (IOException e) { e.printStackTrace(); } } public Object getBean(String name) throws Exception{ String className = prop.getProperty(name); Class beanClass = Class.forName(className); Object obj = beanClass.newInstance();//这就是为什么javabean需要一个默认的无参构造函数的原因:方便利用反射实例化 //如果获取的是代理类,则获取其目标类以及切面类,创建其代理类返回 if(obj instanceof ProxyFactoryBean){ ProxyFactoryBean proxyBean = (ProxyFactoryBean)obj; Object target = Class.forName(prop.getProperty(name+".target")).newInstance(); Advise advise = (Advise)Class.forName(prop.getProperty(name+".advise")).newInstance(); proxyBean.setTarget(target); proxyBean.setAdvise(advise); obj = proxyBean.getProxy(); } return obj; } } --------------------------------------------------------------------------------------------- package com.java.enhance; import java.lang.reflect.Proxy; /** * 动态生成代理类的工厂类 * * @author zhuoni * */ public class ProxyFactoryBean { /*被代理的类,也称为目标类*/ private Object target; /*封装目标类方法执行之外所要做的操作的类*/ private Advise advise; /** * 获取目标类的代理类 * * @return */ public Object getProxy() { Object proxy = Proxy.newProxyInstance( target.getClass().getClassLoader(), target.getClass().getInterfaces(), new MyInvocationHandler(target,advise)); return proxy; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public Advise getAdvise() { return advise; } public void setAdvise(Advise advise) { this.advise = advise; } } package com.java.enhance; /** * 封装代理类所要做的内容的接口 * * * @author zhuoni * */ public interface Advise { public void beforeMethod(); public void afterMethod(); } package com.java.enhance; public class MyAdvise implements Advise { public void beforeMethod() { System.out.println("在目标类方法执行之前要做的内容~"); } public void afterMethod() { System.out.println("在目标类方法执行之后要做的内容~"); } } package com.java.enhance; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; /** * 我的InvocationHandler * * @author zhuoni * */ class MyInvocationHandler implements InvocationHandler{ /*被代理的类,也称为目标类*/ private static Object target; /*封装目标类方法执行之外所要做的操作的类*/ private static Advise advise; public MyInvocationHandler(Object target, Advise advise) { this.target = target; this.advise = advise; } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { advise.beforeMethod(); System.out.println("执行目标方法~"); Object value = method.invoke(target, args); advise.afterMethod(); return value; } public Object getTarget() { return target; } public void setTarget(Object target) { this.target = target; } public Advise getAdvise() { return advise; } public void setAdvise(Advise advise) { this.advise = advise; } } 资源文件:bean.properties: #bean=java.util.ArrayList bean=com.java.enhance.ProxyFactoryBean bean.advise=com.java.enhance.MyAdvise bean.target=java.util.ArrayList