【问题标题】:AspectJ JoinPoint questionAspectJ JoinPoint 问题
【发布时间】:2011-04-19 17:49:59
【问题描述】:

我目前正在使用 JoinPoint 来捕获在运行时传递给服务方法的参数。虽然 JoinPoint 帮助我检索参数值,但我发现它没有提供任何好的 API 来检索参数名称、参数类型、当传递的参数是数组时的单个参数值等。

这是一个例子:

public void doIt(String user, Attribute[] attr, Integer[] i, boolean bool, List<Attribute> list){.....}

对于上述方法,当我使用 JoinPoint.getArgs() 时,我看到参数的垃圾值是数组或集合。如果参数是数组或集合,我如何验证它们是否是其中之一,如何遍历它们以检索单个值?

有什么建议吗? 谢谢

【问题讨论】:

    标签: aspectj


    【解决方案1】:

    这应该可行:

    MethodSignature signature = (MethodSignature)joinPoint.getSignature();
    String[] parameterNames = signature.getParameterNames();
    Object[] parameterValues = joinPoint.getArgs();
    

    parameterNames 应该与您传入的匹配。

    更新 1:您可能在关闭调试符号的情况下进行编译 -(显式传入 javac -g:none,或通过 maven/ant 中的标志)。关闭调试符号后,名称将不可用,并将由编译器替换为 args1 等。尝试使用未明确关闭调试符号的编译。

    【讨论】:

    • 你好,这似乎不起作用。它返回 arg0 arg1 arg2 arg3 arg4 等。
    • 我已经更新了我的答案,你可能已经关闭了调试符号。尝试不显式关闭调试符号,然后应该正确检索参数名称。
    • @Biju 你知道如何在 maven 中打开调试符号吗?
    • 嗨@MordechaiTamam,使用编译器maven插件,调试默认开启-maven.apache.org/plugins/maven-compiler-plugin/…,你可以通过文档中提到的debuglevel标志来控制它
    【解决方案2】:

    AspectJ 切入点

    public pointcut pointcutName():
            execution(* ClassName.method(..));
    

    获取方法的参数名称

    before():pointcutName(){
    String[] paramNames = ((CodeSignature) thisJoinPointStaticPart
                    .getSignature()).getParameterNames();
     for(String paramName:paramNames){
                System.out.println(paramName);
            }
    }
    

    获取参数值:

    before():pointcutName(){
    Object[] paramValues = thisJoinPoint.getArgs();
    
    for (Object object:paramValues){
            System.out.println(object.toString);
            }
    }
    

    获取方法返回值:

    after() returning(Object objectReturn) :pointcutName(){
        System.out.println(objectReturn);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多