gpt4 book ai didi

java - 如何使用注释 @MyFormat ("%td.%
转载 作者:行者123 更新时间:2023-11-30 08:12:51 26 4
gpt4 key购买 nike

如何生成一个类,该类采用 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 方法会导致 ClassCastException,因为 String 值无法转换为 日期。即使通过反射调用方法,Byte Buddy 也不会更改返回类型。

关于java - 如何使用注释 @MyFormat ("%td.%<tm.%<tY"格式化 getBirthday(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30124410/

26 4 0

Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com