发表于: 2018-02-05 23:27:36

1 764


今天完成的事情:

1. 微信上传图片

2. AOP注解形式的的模仿实现




明天计划的事情

1 . 删除项目里不必要的文件

2。修复bug



遇到的问题:


收获:

1. AOP的模仿


步骤:

1. 读取注解所注的类和附加信息,并存储

2. 先执行前置通知后执行代理方法,然后执行后置通知


核心类:

public class ProxyUtil {

   Reflect reflect;

   public ProxyUtil() throws ClassNotFoundException {
      reflect = new Reflect();
   }

   public void getMethod(String name) {
      Map<String, String> map = new HashMap<>();

   }

   //该方法负责代理
  public Object generateEntity(ProxyEntity proxyEntity) throws Throwable {
        String proxyMethodValue = proxyEntity.getMethod().toString().substring(proxyEntity.getMethod().toString().lastIndexOf(" ") + 1, proxyEntity.getMethod().toString().indexOf("("));
       System.out.println("proxyEntity.getMethod():     " + proxyEntity.getMethod().toString());
       //获得存入map的前置与后置的执行方法信息
     Map<String, String> methodMap = reflect.getMap();
       for (Map.Entry<String, String> map : methodMap.entrySet()) {
       if (map.getValue().equals(proxyMethodValue)) {
       //获得织入方法的具体信息到数组
           String[] str = mapKeyDivision(map.getKey());
               if ("before".equals(str[2])) {
               Class<?> clazz = Class.forName(str[1], false, Thread.currentThread().getContextClassLoader()); // 多线程加载该类
              Method method = clazz.getDeclaredMethod(str[0]);
                   method.invoke(clazz.newInstance(), null); // 反射调用方法

           }

      }
   }
   return doAfter(proxyEntity,methodMap);
   }

   private Object  doAfter(ProxyEntity proxyEntity,Map<String,String> map) throws Throwable {

       //调用sing()方法
     Object object = proxyEntity.getMethodProxy().invokeSuper(proxyEntity.getObject(), proxyEntity.getArgs());  // 调用方法
     String proxyMethodValue = proxyEntity.getMethod().toString().substring(proxyEntity.getMethod().toString().lastIndexOf(" ") + 1, proxyEntity.getMethod().toString().indexOf("("));
       for(Map.Entry<String,String> aMap:map.entrySet()){
       if (aMap.getValue().equals(proxyMethodValue)){
             String[] str =mapKeyDivision(aMap.getKey());
             if("after".equals(str[2])){
                   Class<?> clazz = Class.forName(str[1], false, Thread.currentThread().getContextClassLoader());            // 加载该类
          Method method = clazz.getDeclaredMethod(str[0]);
               method.invoke(clazz.newInstance(), null); // 这一步需要原始的类
          }
        }
     }
   return object;
   }


      //分解map里面的键,因为里面存入了方法和类名以及执行顺序
   private String[] mapKeyDivision(String value) {
       String[] str = new String[3];
       str[0] = value.substring(0, value.indexOf("-"));  //注解下面的方法
     str[1] = value.substring(value.indexOf("-") + 1, value.lastIndexOf("-")); //注解所在的类
     str[2]=value.substring(value.lastIndexOf("-")+1,value.length()); //before还是after
       return str;
   }


}




具体代码见github:https://github.com/rcy9527/IT-study/tree/master/AOP


明天计划:

 删除项目里不必要的文件

修复bug

预计完成时间:2018.02.06

DOME时间:2018-2-9



返回列表 返回列表
评论

    分享到