AspectJ:编译时编织强制抛出异常

时间:2016-02-19 06:46:50

标签: java aop aspectj

注意:使用compile time weaving.

我有一个类似

的AOP拦截器
@Around("enableMetricsPointCut(enableMetrics)")
public Object publishMetrics(final ProceedingJoinPoint jp,
            final EnableMetrics enableMetrics) {
    // Catch all Checked exceptions and convert them to unCheckedExceptions
}

现在,我已经注释了一个使用此AOP注释的方法,如

@EnableMetrics( )
public xyzMethod() { 
   // Code throws a checkedException : checkME
}

我被迫添加' throws checkME'到xyzMethod。为什么是这样?考虑到编译时编织我不应该像我的AOP拦截器一样EnableMetrics'不会抛出任何已检查的异常,我正在使用' around'。

有没有办法实现我的目标?我不希望像xyzMethod这样的方法声明任何抛出。

1 个答案:

答案 0 :(得分:0)

你不能。

注释只是...注释。它们可用于避免显示警告(您告诉编译器您知道为什么这样做),生成辅助代码,或....但无论如何,通过删除注释获得的代码是正确的java代码。

在(当前版本)java中,检查异常必须在方法级别声明,AOP无法执行任何操作。

唯一的可能性是,在核心java级别,注释允许使用未声明的已检查异常。但我认为它不存在,因为声明throws Throwable已经产生了这种效果。

TL / DR:如果您不想被检查的异常所困扰,请在您的方法中添加throws Throwable(如果可以接受),或者使用显式包装方法。 AOP和任何其他基于注释的方法都不能从中拯救你。