Android 方法参数无效的 AspectJ @Around
Android AspectJ @Around with method args not working
在我当前的 Android 应用程序中,我正在研究 @AspectJ
的使用
我正在尝试 "capture" 对签名类似于以下方法的所有执行:-
public void onMethodClicked(com.example.CustomType customType) {}
我有以下POINTCUTS
1) 忽略我的看点class:
@Pointcut("!within(com.example.aspect)")
public void notAspect() { }
2) Select 所有 "Clicked" 带有 customType 参数的方法
@Pointcut("execution(* com.example..*.*Clicked(com.example.CustomType)) && args(custom)";)
public void customClicked(CustomType custom) { }
3) 我的 @Around
:-
@Around("notAspect() && customClicked()")
public Object selectedClicked(final ProceedingJoinPoint joinPoint, CustomType custom) throws Throwable {
Log.d(TAG, "Found a clicked method " + custom);
Object result = joinPoint.proceed();
return result;
}
当我构建我的 Android 应用程序时,我收到这些消息
no match for this type name: CustomType [Xlint:invalidAbsoluteTypeName]
bad parameter to pointcut reference
formal unbound in pointcut
no match for this type name: com.example.aspect [Xlint:invalidAbsoluteTypeName]
the parameter custom is not bound in [all branches of] pointcut
use of ProceedingJoinPoint is allowed only on around advice (arg 1 in (before(extraFlags: 2): (((!within(com.example.aspect+) && execution(* com.example..*.*Clicked(com.example.CustomType)) && args(custom)) && persingleton(com.example.aspect.TraceAspect))->void com.example.aspect.TraceAspect.selectedClicked(org.aspectj.lang.JoinPoint, com.example.CustomType)))
我做错了什么?
更新
我已通过更正 !within()
来修复其中一条 error/warning 消息:-
1) 忽略我的看点class:
@Pointcut("!within(com.example.aspect.TraceAspect)")
public void notAspect() { }
我不确定你的问题,但你可以尝试像这样更改 POINTCUT
。
@Pointcut("!within(com.example.aspect.TraceAspect)")
public void notAspect() { }
@Pointcut("execution(* com.example..*.*Clicked(com.example.CustomType)))
public void customClicked() { }
看,我已经删除了 args(custom)
注释中的 args(custom)
部分。是的,我当然删除了 customClicked
函数的函数参数参数和语句末尾的分号。
现在通过从此处传递参数来编写您的 selectedClicked
函数。
@Around("notAspect() && customClicked() && args(custom)")
public Object selectedClicked(final ProceedingJoinPoint joinPoint, CustomType custom) throws Throwable {
Log.d(TAG, "Found a clicked method " + custom);
Object result = joinPoint.proceed();
return result;
}
它应该可以正常工作。
在我当前的 Android 应用程序中,我正在研究 @AspectJ
我正在尝试 "capture" 对签名类似于以下方法的所有执行:-
public void onMethodClicked(com.example.CustomType customType) {}
我有以下POINTCUTS
1) 忽略我的看点class:
@Pointcut("!within(com.example.aspect)")
public void notAspect() { }
2) Select 所有 "Clicked" 带有 customType 参数的方法
@Pointcut("execution(* com.example..*.*Clicked(com.example.CustomType)) && args(custom)";)
public void customClicked(CustomType custom) { }
3) 我的 @Around
:-
@Around("notAspect() && customClicked()")
public Object selectedClicked(final ProceedingJoinPoint joinPoint, CustomType custom) throws Throwable {
Log.d(TAG, "Found a clicked method " + custom);
Object result = joinPoint.proceed();
return result;
}
当我构建我的 Android 应用程序时,我收到这些消息
no match for this type name: CustomType [Xlint:invalidAbsoluteTypeName]
bad parameter to pointcut reference
formal unbound in pointcut
no match for this type name: com.example.aspect [Xlint:invalidAbsoluteTypeName]
the parameter custom is not bound in [all branches of] pointcut
use of ProceedingJoinPoint is allowed only on around advice (arg 1 in (before(extraFlags: 2): (((!within(com.example.aspect+) && execution(* com.example..*.*Clicked(com.example.CustomType)) && args(custom)) && persingleton(com.example.aspect.TraceAspect))->void com.example.aspect.TraceAspect.selectedClicked(org.aspectj.lang.JoinPoint, com.example.CustomType)))
我做错了什么?
更新
我已通过更正 !within()
来修复其中一条 error/warning 消息:-
1) 忽略我的看点class:
@Pointcut("!within(com.example.aspect.TraceAspect)")
public void notAspect() { }
我不确定你的问题,但你可以尝试像这样更改 POINTCUT
。
@Pointcut("!within(com.example.aspect.TraceAspect)")
public void notAspect() { }
@Pointcut("execution(* com.example..*.*Clicked(com.example.CustomType)))
public void customClicked() { }
看,我已经删除了 args(custom)
注释中的 args(custom)
部分。是的,我当然删除了 customClicked
函数的函数参数参数和语句末尾的分号。
现在通过从此处传递参数来编写您的 selectedClicked
函数。
@Around("notAspect() && customClicked() && args(custom)")
public Object selectedClicked(final ProceedingJoinPoint joinPoint, CustomType custom) throws Throwable {
Log.d(TAG, "Found a clicked method " + custom);
Object result = joinPoint.proceed();
return result;
}
它应该可以正常工作。