public static function createFromToken(FunctionDefine $aFunctionDefine) { if (!($aClassDefine = $aFunctionDefine->belongsClass())) { throw new Exception("传入的 \$aFunctionDefine 参数无效,必须是一个类方法的定义Token"); } try { $aMethodRef = new \ReflectionMethod($aClassDefine->fullName(), $aFunctionDefine->name()); } catch (\Exception $e) { throw new Exception("无法找到 Pointcut %s::%s 的定义", array($aClassDefine->fullName(), $aFunctionDefine->name()), $e); } // 检查参数(不能有非可缺省的参数) if ($aMethodRef->getNumberOfRequiredParameters()) { throw new Exception("Pointcut %s::%s() 的定义无效:要求了非可缺省的参数; 请检查该Pointcut的参数表。", array($aClassDefine->fullName(), $aFunctionDefine->name())); } // 声明为静态方法 if ($aMethodRef->isStatic()) { if (!$aMethodRef->isPublic()) { throw new Exception("Pointcut %s::%s() 声明为 static 类型,static 类型的 Pointcut 必须为 public。", array($aClassDefine->fullName(), $aFunctionDefine->name())); } $arrJointPoints = call_user_func(array($aClassDefine->fullName(), $aFunctionDefine->name())); } else { try { $aClassRef = new \ReflectionClass($aClassDefine->fullName()); } catch (\Exception $e) { throw new Exception("无法找到 Aspect %s 的定义,无法定义Pointcut:%s::%s", array($aClassDefine->fullName(), $aClassDefine->fullName(), $aFunctionDefine->name()), $e); } // 检查该类的构造函数的参数 if ($aConstructor = $aClassRef->getConstructor() and $aConstructor->getNumberOfRequiredParameters()) { throw new Exception("由于 Pointcut %s::%s() 没有被申明为 static ,则所属的Aspect(%s)的构造函数不能要求非可省的参数。将 Pointcut %s::%s() 声明为 static,或者取消Aspect(%s)的构造函数所要求的非可省参数。", array($aClassDefine->fullName(), $aFunctionDefine->name(), $aClassDefine->fullName(), $aClassDefine->fullName(), $aFunctionDefine->name(), $aClassDefine->fullName())); } $aMethodRef->setAccessible(true); $arrJointPoints = $aMethodRef->invokeArgs($aClassRef->newInstanceArgs(), array()); } $aPointcut = new self($aFunctionDefine->name()); $aPointcut->sDefineMethod = $aFunctionDefine->name(); if (is_array($arrJointPoints)) { foreach ($arrJointPoints as $aJointPoint) { if ($aJointPoint instanceof JointPoint) { $aPointcut->jointPoints()->add($aJointPoint); $aJointPoint->setPointcut($aPointcut); } else { throw new Exception("Pointcut %s::%s 的定义中,申明了无效的 JointPoint: %s", array($aClassDefine->fullName(), $aFunctionDefine->name(), var_export($aJointPoint, true))); } } } return $aPointcut; }