Java 在Jersey 2中调用代理对象的包私有方法的奇怪行为

Java 在Jersey 2中调用代理对象的包私有方法的奇怪行为,java,jersey-2.0,hk2,dynamic-proxy,Java,Jersey 2.0,Hk2,Dynamic Proxy,下课 public class MaskHolder { private Mask mask; private UUID id = UUID.randomUUID() void store() { System.out.println(id); } public void get() { System.out.println(id); } } 一定是这样的HK2 bind(MaskHolder.class)

下课

public class MaskHolder {

    private Mask mask;
    private UUID id = UUID.randomUUID()

    void store() {
        System.out.println(id);
    }

    public void get() {
        System.out.println(id);
    }

}
一定是这样的HK2

bind(MaskHolder.class).to(MaskHolder.class)
            .proxy(true).proxyForSameScope(false).in(RequestScoped.class);
注入带有@Context的bean的代理的行为与公共方法的预期一样,但也执行包私有方法。问题是包私有方法不会触发MethodInterceptor,因此它实际上不会到达get()的同一实例。
问题是代理将包私有方法调用转发到哪个“默认”实例。调用get()方法我在不同的请求中到达不同的实例,但每次调用store方法都会在同一个实例中结束,因此它的行为类似于singleton。

还有一件事我没有提到-行为类似singleton的代理被注入到
JacksonJsonProvider
子类中。据我所知,JacksonJsonProvider的这个子类在Jersey中只创建了一次,所以注入其中的代理实例在请求之间不会发生变化

Proxy基本上是
MaskHolder
的一个人工子类,在公共方法上带有拦截器,但它基本上是
MaskHolder
的UUID字段。所以,若拦截器不提供RequestScope bean,我们将访问“父”MaskHolder。由于代理实例只被注入JacksonJsonProvider一次,所以请求之间是相同的


MaskHolder
注入到资源中会在请求之间产生不同的代理实例(不同的UUID)。

我记得,在创建类的动态代理(与接口相反)时,必须创建一个不是最终代理类的实例。老实说,我忘了确切的原因。为了更好地控制您的代理,您可能需要研究使用ProxyCtl接口(所有代理都在hk2中实现),但为什么一些实例会跨请求返回?因此,RequestScope是由您使用的框架实现的。这是运动衫吗?是的,我用运动衫。让我看看能不能抽出时间在运动衫上试试