Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java getParameterNames()的AspectJ MethodSignature返回null_Java_Reflection_Aop_Aspectj - Fatal编程技术网

Java getParameterNames()的AspectJ MethodSignature返回null

Java getParameterNames()的AspectJ MethodSignature返回null,java,reflection,aop,aspectj,Java,Reflection,Aop,Aspectj,我有一个方面,它根据目标方法的细节进行各种计算,因此预先提取如下: @Around("execution(* com.xyz.service.AccountService.*(..))") public void validateParams(ProceedingJoinPoint joinPoint) throws Throwable { final MethodSignature signature = (MethodSignature) joinPoint.getSigna

我有一个方面,它根据目标方法的细节进行各种计算,因此预先提取如下:

    @Around("execution(* com.xyz.service.AccountService.*(..))")
public void validateParams(ProceedingJoinPoint joinPoint) throws Throwable {
    final MethodSignature signature = (MethodSignature) joinPoint.getSignature();

    final String methodName = signature.getName();
    final String[] parameterNames = signature.getParameterNames();
    final Object[] arguments = joinPoint.getArgs();
    ...
    ...
    ...
    joinPoint.proceed();
}
在提取的详细信息中,除了总是返回null的parameterNames之外,所有这些都反映了预期的信息。我希望它按照下面的签名返回{accountDetails}。有谁知道我可能遗漏了什么,或者这是一个bug

以下是我正在使用的目标方法的签名:

Long createAccount(RequestAccountDetails accountDetails);
为我工作:

@Aspect
public class MyAspect {

    @Around("execution(* *(..)) && !within(MyAspect)")
    public Object validateParams(ProceedingJoinPoint joinPoint) throws Throwable {
        final MethodSignature signature = (MethodSignature) joinPoint.getSignature();

        final String[] parameterNames = signature.getParameterNames();
        for (String string : parameterNames) {
            System.out.println("paramName: " + string);
        }

        return joinPoint.proceed();

    }
}
输出:
paramName:accountDetails

我已将validateParams的签名更改为:
public Object validateParams(ProceedingJoinPoint-joinPoint)抛出Throwable
,因为
createAccount()
返回一个Long。否则我会得到错误:
应用于不返回void的连接点:{0}

从外观上看,没有可靠的方法(独立于编译时设置的选项)获取参数名。见和。所以我怀疑这可能就是这里的原因。谢谢弗雷德!根据我的分析,似乎有某些环境/JVM配置可以使用paramname,但现在已经有一段时间了,无法回忆起具体的细节。感谢您指出返回值,我已经从代码中修改了这个问题,可能遗漏了一些位。