获取泛型方法调用的返回类型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?
我还没有检查过,但我相信这应该工作。
Method method = ((MethodSignature) thisJoinPoint.getSignature()).getMethod();
Type type = method.getGenericReturnType();
System.out.println("type = " + type);
请看一看的Javadoc在这里:Method#getGenericReturnType()
它只是返回类型变量T,没有任何边界或实际类型。 – Andy
字段#getGenericType()在运行时返回字段的类型,它适用于我,我不知道方法,虽然:-S。 http://download.oracle.com/javase/6/docs/api/java/lang/reflect/Field.html#getGenericType%28%29 – Kowser
if(type.getClass()。getSimpleName()。equals(“ParameterizedTypeImpl “)) String actualType = Arrays.stream(((ParameterizedTypeImpl)type).getActualTypeArguments())。findFirst()。get()。getTypeName(); System.out.println(“actualType =”+ actualType.toString()); } – abshar
嗯,我知道类型擦除。但是AspectJ需要源文件,而不是编译类,所以在解析源文件时,ajc可能会在某处计算并保存返回类型。 – Andy
例如,在调用Foo之后,javac的内部表示将明确的类型强制转换为Bar。 – Andy
而Foo.foo()不会“知道”任何东西 - 它的唯一实现应该在AspectJ中。这不是一个真正的本地方法。 – Andy