0
@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」のメソッドがインターフェイスに属していないことです。

ありがとう!

4

1 に答える 1

0

あなたが欲しいのはデコレータのようです。

于 2012-07-24T16:52:31.133 に答える