Java 在@Around通知中调用procedure()方法之前,如何检索方法声明的返回类型(运行时类型)

Java 在@Around通知中调用procedure()方法之前,如何检索方法声明的返回类型(运行时类型),java,aop,aspectj,Java,Aop,Aspectj,具有以下层次结构: Accessor AccessorSub01 AccessorSub02 将它们视为一组简单的域类 对于@Around建议,我需要知道返回类型的运行时类型,但是在调用procedure()方法之前 通过此链接: 我写了以下内容: @Around("AccessorPointcut.methodLevel05(methodLevel)") public Object aroundMethodLevel05(ProceedingJoinPoin

具有以下层次结构:

Accessor
  AccessorSub01
  AccessorSub02
将它们视为一组简单的域类

对于
@Around
建议,我需要知道返回类型运行时类型,但是在调用
procedure()
方法之前

通过此链接:

我写了以下内容:

@Around("AccessorPointcut.methodLevel05(methodLevel)")
public Object aroundMethodLevel05(ProceedingJoinPoint pjp, MethodLevel methodLevel) {
    String methodName = pjp.getSignature().getName();
    Object[] args = pjp.getArgs();
    System.out.printf("[AccessorAspect - aroundMethodLevel05] " +
                      "MethodName: %s - Arguments: %s - @MethodLevel: %s %n",
                       methodName, Arrays.asList(args), methodLevel.value());

    Signature signature =  pjp.getSignature();
    Class<?> returnType = ((MethodSignature) signature).getReturnType();
    System.out.printf("[AccessorAspect - aroundMethodLevel05] Class<?> [ReturnType CanonicalName]: %s%n", 
                       returnType.getCanonicalName());

    //TODO: implement a cache control

    Object object = null;
    try {
        object = pjp.proceed();
    }
    catch (Throwable e) {
        System.err.printf("%s%n", e.getMessage());
    }

    System.out.printf("[AccessorAspect - aroundMethodLevel05] " +
                      "MethodName: %s - Arguments: %s - @MethodLevel: %s - Returns: %s %n",
                       methodName, Arrays.asList(args), methodLevel.value(), object);
    return object;
}
@Override
@MethodLevel("something01")
public Accessor something01() {
    return new AccessorSub01("Something 01");
}

@Override
@MethodLevel("something02")
public Accessor something02() {
    return new AccessorSub02("Something 02");
}
如果使用以下选项,则
@Around
建议代码可以正常工作:

@Override
@MethodLevel("something01")
public AccessorSub01 something01() {
    return new AccessorSub01("Something 01");
}

@Override
@MethodLevel("something02")
public AccessorSub02 something02() {
    return new AccessorSub02("Something 02");
}
方法声明中的返回类型和返回类型是同一个子类。由于多态性,前者是可能的。因此,在
@Around
中,根据具体情况打印建议
AccessorSub01
AccessorSub02

但具有以下特征:

@Around("AccessorPointcut.methodLevel05(methodLevel)")
public Object aroundMethodLevel05(ProceedingJoinPoint pjp, MethodLevel methodLevel) {
    String methodName = pjp.getSignature().getName();
    Object[] args = pjp.getArgs();
    System.out.printf("[AccessorAspect - aroundMethodLevel05] " +
                      "MethodName: %s - Arguments: %s - @MethodLevel: %s %n",
                       methodName, Arrays.asList(args), methodLevel.value());

    Signature signature =  pjp.getSignature();
    Class<?> returnType = ((MethodSignature) signature).getReturnType();
    System.out.printf("[AccessorAspect - aroundMethodLevel05] Class<?> [ReturnType CanonicalName]: %s%n", 
                       returnType.getCanonicalName());

    //TODO: implement a cache control

    Object object = null;
    try {
        object = pjp.proceed();
    }
    catch (Throwable e) {
        System.err.printf("%s%n", e.getMessage());
    }

    System.out.printf("[AccessorAspect - aroundMethodLevel05] " +
                      "MethodName: %s - Arguments: %s - @MethodLevel: %s - Returns: %s %n",
                       methodName, Arrays.asList(args), methodLevel.value(), object);
    return object;
}
@Override
@MethodLevel("something01")
public Accessor something01() {
    return new AccessorSub01("Something 01");
}

@Override
@MethodLevel("something02")
public Accessor something02() {
    return new AccessorSub02("Something 02");
}
方法声明中的返回类型是超类,与接口声明相同,但返回类型是子类。
@Around
建议始终打印
Accessor
,而不是
AccessorSub01
AccessorSub02

如果可能-如何实现此目标?根据具体情况,我需要
AccessorSub01
AccessorSub02

当然

    Signature signature =  pjp.getSignature();
    Class<?> returnType = ((MethodSignature) signature).getReturnType();
Signature Signature=pjp.getSignature();
类returnType=((MethodSignature)signature).getReturnType();
适用于类/声明,不适用于运行时


记住在调用
procedure()
方法之前,我需要这些数据-因此在该时间点还没有对象。这个请求需要它来实现一种缓存控制。

您的问题意味着AspectJ或您需要一个神奇的水晶球来预测未来,或者可能需要一台时间机器。你怎么可能事先知道一个对象的类型,而这个对象只会在一个尚未调用的方法中创建?这甚至不是AspectJ问题,它本身就是一个逻辑问题

你的问题也是一个例子(就像我刚才评论的上一个问题一样),也就是说,你描述你想象如何从技术上解决问题,而不是说你真正想要实现什么。目前,我只能推测您提出问题的方式,我猜您的应用程序设计在某些方面存在缺陷。例如,为了满足缓存需求,您可能更愿意拦截构造函数调用而不是方法调用,或者使用工厂而不是直接使用
new Something()
,但正如我所说,这是推测。你没有分享足够的信息让我提出更具体的解决方案