A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 等风来_________ 中级黑马   /  2014-3-16 20:34  /  600 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. package com.itheima.day03.aopframework;

  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.util.Properties;

  5. import com.itheima.day03.Advice;

  6. public class BeanFactory {

  7.         Properties prop = new Properties();

  8.         public BeanFactory(InputStream is) {
  9.                 try {
  10.                         prop.load(is);
  11.                 } catch (IOException e) {
  12.                         e.printStackTrace();
  13.                 }
  14.         }

  15.         public Object getBean(String name) {
  16.                 // 获取类名
  17.                 String className = prop.getProperty(name);
  18.                 // System.out.println(className);
  19.                 Object bean = null;

  20.                 try {
  21.                         // 获取类字节码文件
  22.                         Class clazz = Class.forName(className);
  23.                         // 创建实例
  24.                         bean = clazz.newInstance();
  25.                 } catch (ClassNotFoundException e1) {
  26.                         // TODO Auto-generated catch block
  27.                         e1.printStackTrace();
  28.                 } catch (InstantiationException e1) {
  29.                         // TODO Auto-generated catch block
  30.                         e1.printStackTrace();
  31.                 } catch (IllegalAccessException e1) {
  32.                         // TODO Auto-generated catch block
  33.                         e1.printStackTrace();
  34.                 }

  35.                 if (bean instanceof ProxyFactoryBean) {
  36.                         Object proxy = null;
  37.                         ProxyFactoryBean proxyFactoryBean = (ProxyFactoryBean) bean;
  38.                         try {
  39.                                 Advice advice = (Advice) Class.forName(
  40.                                                 prop.getProperty(name + ".advice")).newInstance();
  41.                                 Object target = Class.forName(
  42.                                                 prop.getProperty(name + ".target")).newInstance();
  43.                                 proxyFactoryBean.setAdvice(advice);
  44.                                 proxyFactoryBean.setTarget(target);
  45.                                 proxy = proxyFactoryBean.getProxy();
  46.                         } catch (InstantiationException e) {
  47.                                 // TODO Auto-generated catch block
  48.                                 e.printStackTrace();
  49.                         } catch (IllegalAccessException e) {
  50.                                 // TODO Auto-generated catch block
  51.                                 e.printStackTrace();
  52.                         } catch (ClassNotFoundException e) {
  53.                                 // TODO Auto-generated catch block
  54.                                 e.printStackTrace();
  55.                         }
  56.                         return proxy;
  57.                 }
  58.                 return bean;
  59.         }
  60. }
复制代码
  1. package com.itheima.day03.aopframework;

  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. import java.util.Collection;

  6. import com.itheima.day03.Advice;

  7. public class ProxyFactoryBean {

  8.         private Advice advice;
  9.         private Object target;
  10.         public Advice getAdvice() {
  11.                 return advice;
  12.         }
  13.         public void setAdvice(Advice advice) {
  14.                 this.advice = advice;
  15.         }
  16.         public Object getTarget() {
  17.                 return target;
  18.         }
  19.         public void setTarget(Object target) {
  20.                 this.target = target;
  21.         }
  22.         public Object getProxy() {
  23.                 Object proxy = Proxy.newProxyInstance(target.getClass()
  24.                                 .getClassLoader(),
  25.                 /* new Class[] { Collection.class }, */
  26.                 target.getClass().getInterfaces(), new InvocationHandler() {

  27.                         @Override
  28.                         public Object invoke(Object proxy, Method method, Object[] args)
  29.                                         throws Throwable {
  30.                                
  31.                                 advice.beforeMethod(method);
  32.                                 Object retVal = method.invoke(target, args);       
  33.                                 advice.afterMethod(method);
  34.                                
  35.                                
  36.                                 return retVal;
  37.                         }
  38.                 });
  39.                 return proxy;
  40.         }

  41. }
复制代码
  1. package com.itheima.day03.aopframework;

  2. import java.io.InputStream;

  3. public class AopFrameWorkTest {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 // TODO Auto-generated method stub
  9.                 InputStream is=AopFrameWorkTest.class.getResourceAsStream("config.properties");
  10.                 Object bean=new BeanFactory(is).getBean("xxx");
  11.                 System.out.println(bean.getClass().getName());
  12.         }

  13. }
复制代码
  1. package com.itheima.day03;

  2. import java.lang.reflect.Method;

  3. public interface Advice {
  4.         public void beforeMethod(Method method);
  5.        
  6.         public void afterMethod(Method method);
  7. }
复制代码
  1. #xxx=java.util.ArrayList
  2. xxx=com.itheima.day03.aopframework.ProxyFactoryBean
  3. xxx.advice=com.itheima.day03.MyAdvice
  4. xxx.target=java.util.ArrayList
复制代码

这个是关于动态代理的问题,求原理的解释。
很迷茫啊,这儿。完全没有接触过的东西。  
有点迷糊。
求大神指点。

评分

参与人数 1技术分 +1 收起 理由
菜小徐 + 1

查看全部评分

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马