1

如何生成一个类,该类接受一个 Person 实例并将生日作为字符串返回,而不是使用 @MyFormat 注释的值格式化的日期,而无需手动编写该子类?

目的是使用生成的实例来生成 HTML 页面

class Person {

    @MyFormat("%td.%<tm.%<tY")
    public Date getBirthday() { return birthday; }
}

// Usage somewhere in the code

...
List<Person> people = people.parallelStream()
    .map(p -> MyFormatInterceptor.wrap(p))
    .collect(toCollection(ArrayList::new));


System.out.println(people.iterator().next().getBirtday()) // 31.Mai.2015

我有这个(见下文)。

返回类型从 Date 更改为 String 并不重要,因为调用是通过评估表达式“person.birthday”的反射进行的。

new ByteBuddy()
   .subclass(person.getClass())
   .method(isAnnotatedWith(MyFormat.class))
   .intercept(MethodDelegation.to(MyFormatInterceptor.class))
   .make()
   .load(person.getClass().getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)
   .getLoaded();

class MyFormatInterceptor {

    @RuntimeType 
    public static Object format(@Origin Method m, @SuperCall Callable<?> zuper) {

        MyFormat formatAnnotation = m.getAnnotation(MyFormat.class);

        return String.format(formatAnnotation.value(), zuper.call());
    }
}

因此,新类将具有相同的方法名称“String getBirthday()”,但使用 String 作为返回值。


我不完全确定我是否理解你试图完成的事情。以下代码正在创建一个Person您不使用的子类:

new ByteBuddy()
  .subclass(person.getClass())
  .method(isAnnotatedWith(MyFormat.class))
  .intercept(MethodDelegation.to(MyFormatInterceptor.class))
  .make()
  .load(person.getClass().getClassLoader(),                  
        ClassLoadingStrategy.Default.WRAPPER)
  .getLoaded();

当您在运行时使用此生成的子类时,调用该getBirthday方法会导致 a值无法强制转换为ClassCastExceptiona 。Byte Buddy 不会更改返回类型,即使在通过反射调用方法时也是如此。StringDate

4

1 回答 1

1

我不完全确定我是否理解你试图完成的事情。以下代码正在创建一个Person您不使用的子类:

new ByteBuddy()
  .subclass(person.getClass())
  .method(isAnnotatedWith(MyFormat.class))
  .intercept(MethodDelegation.to(MyFormatInterceptor.class))
  .make()
  .load(person.getClass().getClassLoader(),                  
        ClassLoadingStrategy.Default.WRAPPER)
  .getLoaded();

当您在运行时使用此生成的子类时,调用该getBirthday方法会导致 a值无法强制转换为ClassCastExceptiona 。Byte Buddy 不会更改返回类型,即使在通过反射调用方法时也是如此。StringDate

于 2015-05-09T21:48:47.640 回答