java技术之动态代理以及AOP编程

来源:互联网 发布:sopcast网络电视成人台 编辑:程序博客网 时间:2024/06/07 05:17

写技术博客挺累的啊....总结了一下午总算是出来了~废话不多说,贴代码吧~


名词解释:

动态代理:既指类的代理对象是动态生成的,而不是有程序员预先编写好的,这里利用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




原创粉丝点击