4

我们有一个大类(100 多个方法),它有一个用延迟加载指南注释的接口。最初加载此对象并将其发送到客户端时,我们会对最常用和最近的数据进行有限加载。我们目前正在使用 java Proxying 来嗅探每个调用。在每次调用时,我们都会检查“我们有数据吗?如果有日期参数,我们是否加载了该日期的数据?” 如果这些问题的答案是否定的,我们将返回服务器并加载完整的对象。

然而,这是可行的,Java 反射、代理和调用(getId()例如基本 getter)的额外开销会对我们的某些代码的性能造成严重破坏。

我想开始使用 byte buddy 来减少调用成本,尤其是在总是加载的简单字段上。

解决这个问题的最佳方法是什么?

此外,因为这个对象正在被序列化(Java 序列化,服务器生成这些对象并将它们交给客户端),确保这些动态创建的类可以通过网络从服务器传递到客户端的正确方法是什么?

4

1 回答 1

1

使用 Byte Buddy 可以做不同的一件事,就是以不同的方式拦截不同的方法。这样,您可以在创建代理时考虑可用数据,而不是将其延迟到运行时。例如:

interface Foo {

  Object simpleProperty();

  @Lazy
  Object complexProperty();

  @Lazy
  Object timedProperty(Date date);
}

您可以编写一个匹配任何方法的拦截器:

new ByteBuddy()
  .subclass(Foo.class)
  .method(any()).
    intercept(directValueInterceptor)
  .method(isAnnotatedBy(Lazy.class))
    .intercept(lazyValueInterceptor)
  .method(isAnnotatedBy(Lazy.class).and(takesArguments(Date.class))
    .intercept(lazyTimedInterceptor)

匹配器按它们的顺序反向应用,这意味着被注释Lazy并接受参数Date的方法被最后一个拦截器拦截,而没有注释的方法被第一个拦截器匹配。这样,您可以编写专门的拦截器,这些拦截器根据如何返回值的假设进行操作,并且您不再需要在运行时进行自省。

于 2015-06-11T11:10:48.303 回答