如何生成一个类,该类接受一个 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 作为返回值。