《黑马程序员》 动态代理之Aop框架的实现

来源:互联网 发布:墨子号 知乎 编辑:程序博客网 时间:2024/05/01 21:22
package cn.itheima.day427.aopframework;import java.lang.reflect.Method;public interface Advice {void beginTime(Method method);void endTime(Method method);}package cn.itheima.day427.aopframework;import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class BeanFactory {//标准类就直接返回这个类的对象//代理的类就创建这个类的代理。然后返回这个代理对象private Properties prop=new Properties();public BeanFactory(InputStream is){try {prop.load(is);} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public Object getBean(String name){Object bean=null;try {//返回bean对象Class clazz=Class.forName(prop.getProperty(name)); bean=clazz.newInstance();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}if(bean instanceof ProxyFactoryBean){//特殊的bean的处理Object proxy=null;try {ProxyFactoryBean proxyBean=(ProxyFactoryBean)bean;//获取advice和target对象Advice advice=(Advice)Class.forName(prop.getProperty(name+".advice")).newInstance();Object target=Class.forName(prop.getProperty(name+".target")).newInstance();proxyBean.setAdvice(advice);proxyBean.setTarget(target);proxy = proxyBean.getProxy();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}return proxy;}return bean;}}package cn.itheima.day427.aopframework;import java.lang.reflect.Method;import java.util.Random;import java.util.concurrent.TimeUnit;public class MyAdvice implements Advice {private long beginTime;@Overridepublic void beginTime(Method method) {try {beginTime = System.currentTimeMillis();TimeUnit.SECONDS.sleep(new Random().nextInt(5) + 1);} catch (Exception e) {// TODO: handle exception}}@Overridepublic void endTime(Method method) {long endTime=System.currentTimeMillis();System.out.println(method.getName()+"运行了:"+(endTime-beginTime)/1000+"秒");}}package cn.itheima.day427.aopframework;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() { // 返回产生的代理类对象Object proxy = Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method,Object[] args) throws Throwable {advice.beginTime(method);  //面向切面的编程Object retVal=method.invoke(target, args);advice.endTime(method);return retVal;}});return proxy;}}package cn.itheima.day427.aopframework;import java.io.InputStream;public class AopFrameworkDemo {/** * @param args */public static void main(String[] args) {InputStream is=AopFrameworkDemo.class.getResourceAsStream("config.properties");Object bean=new BeanFactory(is).getBean("xxxx");System.out.println(bean.getClass().getName());  //代理对象怎么有返回}}#xxxx=java.util.ArrayListxxxx=cn.itheima.day427.aopframework.ProxyFactoryBeanxxxx.advice=cn.itheima.day427.aopframework.MyAdvicexxxx.target=java.util.ArrayList

0 0
原创粉丝点击