获取泛型方法调用的返回类型AspectJ中

问题描述:

我有泛型方法Foo.foo()获取泛型方法调用的返回类型AspectJ中

class Foo { 
    static native T <T> foo(); 
} 

Bar bar = Foo.foo(); 

我需要的是更换到使用AspectJ这种方法调用。问题是,从方面返回类型T的值,我需要知道T是什么。我如何使用AspectJ做到这一点?

这里是一个解决方案,我已经试过:

Object around() : call(* Foo.foo(..)) { 
    Class target = ((MethodSignature) thisJoinPoint.getSignature()).getReturnType(); 
    System.out.println("class = " + class); 
} 

它返回Object作为类返回类型。我怎样才能确定调用foo()应该实际返回Bar的实例?

在运行时,您将无法辨别。 Bar for T的替换在编译时会被删除,因此您的建议将无法使用。

如果MethodSignature提供类似于getGenericReturnType()的东西,最好能够告诉你的是Foo.foo()的返回类型是T.它将询问烘焙到类文件中的泛型信息对于Foo而言,而不是能够从运行时调用中找出预期的类型。

另一个问题给你:Foo.foo()知道如何返回Bar?

+0

嗯,我知道类型擦除。但是AspectJ需要源文件,而不是编译类,所以在解析源文件时,ajc可能会在某处计算并保存返回类型。 – Andy

+0

例如,在调用Foo之后,javac的内部表示将明确的类型强制转换为Bar。 – Andy

+0

而Foo.foo()不会“知道”任何东西 - 它的唯一实现应该在AspectJ中。这不是一个真正的本地方法。 – Andy

我还没有检查过,但我相信这应该工作。

Method method = ((MethodSignature) thisJoinPoint.getSignature()).getMethod(); 
Type type = method.getGenericReturnType(); 
System.out.println("type = " + type); 

请看一看的Javadoc在这里:Method#getGenericReturnType()

+0

它只是返回类型变量T,没有任何边界或实际类型。 – Andy

+0

字段#getGenericType()在运行时返回字段的类型,它适用于我,我不知道方法,虽然:-S。 http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#getGenericType%28%29 – Kowser

+0

if(type.getClass()。getSimpleName()。equals(“ParameterizedTypeImpl “)) String actualType = Arrays.stream(((ParameterizedTypeImpl)type).getActualTypeArguments())。findFirst()。get()。getTypeName(); System.out.println(“actualType =”+ actualType.toString()); } – abshar