XianyuTech / aspectd

AOP for Flutter(Dart)
MIT License
1.1k stars 123 forks source link

不同dert文件中不同类里面,相同名称的方法注入有错乱 #123

Open lancexin opened 3 years ago

lancexin commented 3 years ago

比如 文件 a.dart 里面有 TestClassA 类里面有loadSuccess方法 文件b.dart里面有 TestClassB 类里面也有loadSuccess方法

我注入了a.dart 里面的loadSuccess方法,但是b.dart里面的方法却会触发

lancexin commented 3 years ago

@Execute("package:test/app/modules/test1_module/test1_controller.dart","Test1Controller","-onReady") @pragma("vm:entry-point") void onReady(PointCut pointcut) { Log.d('Test1Controller onReady',tag: LOG_TAG_INJECT); pointcut.proceed(); }

@Execute("package:test/app/modules/test2_module/test2_controller.dart","Test2Controller","-onReady") @pragma("vm:entry-point") void onReady2(PointCut pointcut) { Log.d('Test2Controller onReady',tag: LOG_TAG_INJECT); pointcut.proceed(); } }

发现注入了相同的方法,两个类中都有onReady方法,但是本来应该触发下面的,却出发了上面的.

lancexin commented 3 years ago

修改了一下源码,解决了这个问题,在调用visitProcedure的时候添加了clsName的检测

@override void visitProcedure(Procedure node) { String procedureName = node.name.name; bool needCompareClass = false; Class originalClass = null; if(node.parent is Class){ needCompareClass = true; originalClass = node.parent; } String clsName = null; if(needCompareClass){ clsName = originalClass.name; }

AopItemInfo matchedAopItemInfo;
int aopItemInfoListLen = _aopItemInfoList.length;
for (int i = 0; i < aopItemInfoListLen && matchedAopItemInfo == null; i++) {
  AopItemInfo aopItemInfo = _aopItemInfoList[i];
  if ((aopItemInfo.isRegex &&
          RegExp(aopItemInfo.methodName).hasMatch(procedureName)) ||
      (!aopItemInfo.isRegex && procedureName == aopItemInfo.methodName )) {
    if(needCompareClass){
      if(aopItemInfo.clsName == clsName){
        matchedAopItemInfo = aopItemInfo;
        break;
      }
    }else{
      matchedAopItemInfo = aopItemInfo;
      break;
    }
  }
}
if (matchedAopItemInfo == null) {
  return;
}