通过反射模拟AOP的动态代理

来源:互联网 发布:老男孩 python 编辑:程序博客网 时间:2024/05/18 03:09

config.property


#xxx=java.util.ArrayListxxx=AOPProxy.ProxyFactoryBeanxxx.advice=AOPProxy.Advicexxx.target=java.util.ArrayList

BeanFactory


package AOPProxy;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class BeanFactory {Properties pro = new Properties();public BeanFactory(InputStream is) throws IOException{pro.load(is);}public Object getBean(String name) throws ClassNotFoundException, InstantiationException, IllegalAccessException{Object proxy = null;String className = pro.getProperty(name);Class cla = Class.forName(className);Object bean = (Object)cla.newInstance();System.out.println("-----------------");if(bean instanceof ProxyFactoryBean){Advice advice =(Advice) Class.forName((String)pro.get(name +".advice")).newInstance();Object target = (Object)Class.forName((String)pro.get(name +".target")).newInstance();ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean)bean;proxyFactoryBean.setAdvice(advice);proxyFactoryBean.setTarget(target);proxy = (proxyFactoryBean).getProxy();return proxy;}return bean;}private Object ProxyFactoryBean(Object bean) {// TODO Auto-generated method stubreturn null;}}




ProxyFactoryBean

package AOPProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;public class ProxyFactoryBean {private Advice advice;private Object target;public Advice getAdvice() {return advice;}public void setAdvice(Advice advice) {this.advice = advice;}public Object getTarget() {return target;}public void setTarget(Object target) {this.target = target;}public Object getProxy() {// TODO Auto-generated method stubObject proxy3 = (Object)Proxy.newProxyInstance(target.getClass().getClassLoader(),//new Class[]{Collection.class},target.getClass().getInterfaces(),new InvocationHandler() {//分别是对象,方法,参数@Overridepublic Object invoke(Object proxy, Method method, Object[] args)throws Throwable {/*long bt = System.currentTimeMillis();//将调用的方法关联起来Object retVal = method.invoke(target, args);for (int i = 0; i <10; i++) {}long et = System.currentTimeMillis();System.out.println(method.getName()+" "+ (et - bt )+"hehe");return retVal;*///直接调用方法advice.beforeMethod(method);//将调用的方法关联起来Object retVal = method.invoke(target, args);for (int i = 0; i <10; i++) {}advice.afterMethod(method);return retVal;}});return proxy3;}}


AOPTest


package AOPProxy;import java.io.IOException;import java.io.InputStream;import java.net.URL;public class AopTest {public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, IOException {InputStream is = (InputStream)AopTest.class.getResourceAsStream("config.properties");Object bean = (Object)new BeanFactory(is).getBean("xxx");System.out.println(bean.getClass().getName());//System.out.println(bean.getClass().getName());}}


Advice:


package AOPProxy;import java.lang.reflect.Method;public class Advice {long bt,et;public void beforeMethod(Method method) {// TODO Auto-generated method stubbt = System.currentTimeMillis();}public void afterMethod(Method method) {// TODO Auto-generated method stubet = System.currentTimeMillis();}}



0 0