我有一个接受任何类型作为其参数的通用方法。
例如,我想要一个切入点,它与仅以“String”类型作为参数的方法的调用相匹配。最终的要求是将建议执行的范围限制为“字符串”参数。
这是我的通用类和方法:
public class Param<T> {
public T execute(T s){
return s;
}
}
主类:我的应用程序以布尔值和字符串作为参数调用该方法。
public static void main(String[] args) {
Param<String> sp = new Param<String>();
String rs = sp.execute("myString"); //want a joint point
Param<Boolean> bp = new Param<Boolean>();
Boolean rb = bp.execute(true); //dont want a joint point
}
下面的切入点对于字符串和布尔参数都有效(实际上适用于任何类型)。但我想要一个切入点,仅当参数为 String 类型时才拦截方法调用。
@Pointcut("call(* com.amazon.auiqa.aspectj.generics.Param.execute(**))")
void param(){}
@Pointcut("execution(Object com.amazon.auiqa.aspectj.generics.Param.execute(Object))")
void param(){}
以下内容对我不起作用:
@Pointcut("execution(String com.amazon.auiqa.aspectj.generics.Param.execute(String))")
@Pointcut("call(String com.amazon.auiqa.aspectj.generics.Param.execute(String))")
我想知道是否有可能在这里实现我想要实现的目标。我想对方法返回类型做同样的事情。
您无法使用 AspectJ 或任何其他字节码操作库来执行此操作,因为泛型类型信息实际上会从编译的字节码中删除(从 Java 9 开始),因此您的泛型方法将变为public Object execute(Object s)
,因为类型参数T
是无界的。看类型擦除 https://docs.oracle.com/javase/tutorial/java/generics/erasure.html有关详细信息,请参阅 Java 文档。
虽然原始方法签名以元数据的形式保留,但编译器可以在针对泛型代码进行编译时检查是否遵守类型边界,但这不会以任何方式帮助您确定该类的实例的泛型类型参数被实例化,因为该信息根本不存在。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)