gpt4 book ai didi

java - 使用java反射获取scala中aspect中具有特定注释的方法参数

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:21 28 4
gpt4 key购买 nike

我正在使用aspectjscala中使用aop。我有一个方法

def delete(@Id id:Long, name:String)

如何获取方面文件中 id 的值。

@Around("execution (* com.myapp.Employee.delete(..))")   
def message(joinPoint: ProceedingJoinPoint): Object = {
val methodSignature =joinPoint.getSignature.asInstanceOf[MethodSignature]
//get the value of the field id
joinPoint.proceed
}

我无法获取这些值。

如果我尝试

val res = methodSignature.getMethod.getParameterAnnotations
res.map(annotations => println("size = "+annotations.length))

它总是将尺寸打印为0。

编辑:现在我得到了正确的尺寸。该方法位于对象中。但我认为java反射读取object存在一些问题。我更改为 class 现在能够获取注释。但是如何获取带有该注解的参数呢?

最佳答案

这里是一些 Java 示例代码,展示了如何获取方法注释以及参数注释以及参数类型(参数名称不可用,正如已经提到的cchantep)。我想你可以自己轻松地将其转换为 Scala。

package de.scrum_master.aspect;

import java.lang.annotation.Annotation;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;

@Aspect
public class MyAspect {
@Before("execution (* com.myapp.Employee.delete(..))")
public void myAdvice(JoinPoint joinPoint) throws Throwable {
System.out.println(joinPoint);
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
String methodName = signature.getMethod().getName();
Class<?>[] parameterTypes = signature.getMethod().getParameterTypes();

System.out.println("Method annotations:");
Annotation[] methodAnnotations = joinPoint.getTarget().getClass().getMethod(methodName, parameterTypes).getAnnotations();
for (Annotation annotation : methodAnnotations)
System.out.println(" " + annotation);

System.out.println("Parameter annotations:");
Annotation[][] parameterAnnotations = joinPoint.getTarget().getClass().getMethod(methodName, parameterTypes).getParameterAnnotations();
int parameterIndex = 0;
for (Annotation[] annotationsPerParameter : parameterAnnotations) {
System.out.println(" Parameter of type " + parameterTypes[parameterIndex++].getName() + ":");
for (Annotation annotation : annotationsPerParameter)
System.out.println(" " + annotation);
}
}
}
<小时/>

更新:

嗯,在 Java 8 中有一个 way to determine parameter names如果您使用 -parameters 选项编译类。如果您使用 Java 8 JRE/JDK,Eclipse 中还有一个编译器开关:

Eclipse compiler settings for Java 8

您还应该使用兼容 Java 8 的 AspectJ 版本,例如当前的 1.8.5。那么你的方面可以如下所示:

package de.scrum_master.aspect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Method;
import java.lang.reflect.Parameter;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.reflect.MethodSignature;

@Aspect
public class MyAspect {
@Before("execution(!static * *..Application.*(..))")
public void myAdvice(JoinPoint joinPoint) throws Throwable {
System.out.println(joinPoint);
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
Parameter[] parameters = method.getParameters();

System.out.println("Method annotations:");
Annotation[] methodAnnotations = method.getAnnotations();
for (Annotation annotation : methodAnnotations)
System.out.println(" " + annotation);

System.out.println("Parameter annotations:");
for (Parameter parameter : parameters) {
System.out.println(" " + parameter.getType().getName() + " " + parameter.getName());
for (Annotation annotation : parameter.getAnnotations())
System.out.println(" " + annotation);
}
}
}

关于java - 使用java反射获取scala中aspect中具有特定注释的方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28292310/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com