如何使用byte buddy创建延迟加载类?

时间:2015-06-11 00:55:37

标签: java bytecode byte-buddy

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

但是,java反射,代理以及基本getter(例如getId())等调用的额外开销会对我们的一些代码的性能造成严重破坏。

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

最好的方法是什么?

此外,由于此对象正在被序列化(Java序列化,服务器生成这些对象并将其移交给客户端),确保这些动态创建的类可以通过服务器从服务器传递到客户端的正确方法是什么。线?

1 个答案:

答案 0 :(得分: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的方法被最后一个拦截器截获,而未注释的方法则由第一个拦截器。通过这种方式,您可以编写专门的拦截器,这些拦截器基于如何返回值进行操作,并且您不再需要在运行时进行内省。