Jakarta ee 特定类型的CDI侦听器

Jakarta ee 特定类型的CDI侦听器,jakarta-ee,cdi,interceptor,Jakarta Ee,Cdi,Interceptor,在标有星星的线条中,我当然可以通过反射来检查该方法是否存在,并据此决定该怎么做。 但我想知道是否有更好的方法来实现同样的行为? 例如,是否可以将拦截器仅与特定类型关联(在本例中,假设我不希望拦截MyObject的foo2()方法,因为此类对象不实现Page)?我也考虑过使用decorator,但问题是“foo”的方法不属于接口 谢谢大家! 听起来你想要的是一个。嗨!谢谢你的回答。。正如我所写的“我也考虑过使用decorator,但问题是“foo”的方法不属于接口…”。。我确实注释了不属于接口的方

在标有星星的线条中,我当然可以通过反射来检查该方法是否存在,并据此决定该怎么做。 但我想知道是否有更好的方法来实现同样的行为? 例如,是否可以将拦截器仅与特定类型关联(在本例中,假设我不希望拦截MyObject的foo2()方法,因为此类对象不实现Page)?我也考虑过使用decorator,但问题是“foo”的方法不属于接口


谢谢大家!

听起来你想要的是一个。

嗨!谢谢你的回答。。正如我所写的“我也考虑过使用decorator,但问题是“foo”的方法不属于接口…”。。我确实注释了不属于接口的方法,因此装饰程序不会有帮助(CDI中没有任何东西可以真正做到这一点。不过,您可能可以将其作为一个扩展。
@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;
    }

}