@InterceptorBinding
@Target({ ElementType.TYPE, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPageReload {
}
public interface Page{
public static final String LOAD_STR = "load";
public void load();
}
@RequestScoped
public class PageImpl1 implements Page{
public void load(){
//...
}
@RequiresPageReload
public String foo(){
//...
return "foo1";
}
}
@RequestScoped
public class MyObject{
@RequiresPageReload
public String foo2(){
//...
return "foo2";
}
}
@RequiresPageReload
@Interceptor
public class RequiresPageReloadInterceptor implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
@AroundInvoke
public Object forceReload(InvocationContext context) throws Exception {
Object result = context.proceed();
context.getMethod().getDeclaringClass().getDeclaredMethod(Page.LOAD_STR).invoke(context.getTarget()); //***
return result;
}
}
もちろん、星印の付いた線では、その方法が存在するかどうかを振り返って確認し、それに応じて何をすべきかを決定することができます。しかし、同じ振る舞いを実現するためのより良い方法があるのだろうか?たとえば、インターセプターを特定のタイプのみに関連付けることは可能ですか(この例では、MyObjectのfoo2()メソッドがPageを実装していないため、そのようなオブジェクトがインターセプトされたくないと想像してください)?デコレータの使用も検討しましたが、問題は「foo」のメソッドがインターフェイスに属していないことです。
ありがとう!