首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring如何从方法中获取args名称?

spring如何从方法中获取args名称?
EN

Stack Overflow用户
提问于 2014-07-29 02:20:05
回答 3查看 1.2K关注 0票数 0

在春天,它用这样的方式来表达艺术名称:

代码语言:javascript
复制
@Before(
value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && @annotation(auditable)",
argNames="bean,auditable")
public void audit(JoinPoint jp, Object bean, Auditable auditable) {
    AuditCode code = auditable.value();
// ... use code, bean, and jp
}

在doc中,它表示您可以从"argNames“属性的值中省略参数的名称。spring如何从argNames("bean,auditable")获得anyPublicMethod?

java提供了一些api来获取参数名吗?

我认为它使用aspectJ来解析表达式,aspectJ提供了这个特性吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-07-29 03:15:10

在Java8中,我们可以使用反射获取参数名称,参见http://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html。但是,如果类是用-g:vars编译的,则会出现参数名称。

在早期的版本中,我们需要使用一些工具,比如Javassist:

代码语言:javascript
复制
public static void main(String[] args) throws Exception {
    ClassPool pool = ClassPool.getDefault();
    CtClass c = pool.get("test.Test");
    CtMethod m = c.getDeclaredMethod("main");
    MethodInfo methodInfo = m.getMethodInfo();
    LocalVariableAttribute t = (LocalVariableAttribute) methodInfo.getCodeAttribute().getAttribute(javassist.bytecode.LocalVariableAttribute.tag);
    int i = t.nameIndex(0); 
    String v = methodInfo.getConstPool().getUtf8Info(i);
    System.out.println(v); 
}

版画

代码语言:javascript
复制
args
票数 2
EN

Stack Overflow用户

发布于 2014-07-29 03:05:17

你的注释

代码语言:javascript
复制
@Before(
value="com.xyz.lib.Pointcuts.anyPublicMethod() && target(bean) && @annotation(auditable)",
argNames="bean,auditable")

,假设anyPublicMethod()匹配任何公共方法,将匹配任何带有注释的任何公共方法,无论参数名为auditable并在绑定到名为bean的参数的对象上调用。

在您的方法中,名为auditable的参数类型为Auditable,因此这个@Before建议将匹配以下内容

代码语言:javascript
复制
public class SomeComponent {
    @Auditable
    public void someMethod() {}
}

在调用通知时,我将将SomeComponent类型bean绑定到bean参数,并将@Auditable注释的实例绑定到auditable参数。

Java没有获取参数名称的API。参数名也不总是出现在字节码中。当它们出现时,Spring使用ASM库来解析字节码并检索它们。

票数 0
EN

Stack Overflow用户

发布于 2014-07-29 06:38:40

只是对其他答案的补充。Spring文档是显式的: Spring尽力检索正确的参数:

  • 如果使用Java 8,则使用Java 8反射
  • 如果类是在调试模式下编译的,则存在参数名称,而spring使用它,如果使用了ajc (aspectJ编译器),则相同。
  • 它最终可以使用@Param注释。
  • 它使用类型(如果不是歧义的话)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25007286

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档