# 1.问题的开始
在[Spring AOP中args和arg-names的使用](http://0.0.4.87/)的最后我提到了在Spring AOP的注解方式中的@Pointcut的args配置时,对于args中的变量名必须匹配@Pointcut注解所在方法中的参数名的问题。代码如下:
```java
@Pointcut("execution(* com.lcifn.spring.aop.bean.ChromeBrowser.*(..)) && args(music,date)")
private void pointcut(String music, Date date){}
即args(music,date)中的music和date必须同pointcut方法中的music和date一致,如果将pointcut方法改成
pointcut(String video, Date date)
就会抛出异常
Caused by: java.lang.IllegalArgumentException: warning no match for this type name: music [Xlint:invalidAbsoluteTypeName]
at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:301)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:206)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:192)
at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:169)
经过反复测试,证明args中的变量名称同pointcut方法中的参数名称必须一致。因而就引发了下一个问题,它是怎么获取到方法中的参数名的?
关于java获取方法参数名,之前看过一些文章,观点基本是一致的。
即可以从字节码中获取方法的参数名,但是有限制,只有在编译时使用了-g或者-g:vars参数生成了调试信息,class文件中才会生成方法参数名信息(在本地变量表LocalVariableTable中),而不使用-g时编译的class文件中则会丢弃方法参数名信息。
通过javap反编译生成的class文件
javap -c -v AspectJAnnotationArgsBrowserAroundAdvice.class
反编译的结果:
Classfile /e:/exercise/workspace/spring-d/target/classes/com/lcifn/spring/aop/ad
vice/AspectJAnnotationArgsBrowserAroundAdvice.class
Last modified 2017-8-23; size 2133 bytes
MD5 che