java - 返回子类型时是否需要 Assigner.Typing.DYNAMIC 分配器?
问题描述
假设我希望Function<Object, Object>
通过做一些非常愚蠢的事情来实现接口:
final ParameterizedType whatTheUserWillSee = functionObjectObject(); // e.g. Function<Object, Object>
DynamicType.Builder<?> builder = builder
.subclass(Object.class, ConstructorStrategy.Default.NO_CONSTRUCTORS)
.merge(Visibility.PUBLIC, SyntheticState.SYNTHETIC, TypeManifestation.FINAL)
.defineConstructor(Visibility.PUBLIC, SyntheticState.SYNTHETIC)
.intercept(MethodCall.invoke(OBJECT_CONSTRUCTOR).onSuper()) // OBJECT_CONSTRUCTOR is just new Object()
.implement(whatTheUserWillSee)
.intercept(MethodCall.invoke(new MethodDescription.ForLoadedMethod(Object.class.getMethod("toString"))
.withAssigner(Assigner.DEFAULT, Assigner.Typing.DYNAMIC));
也就是说,我正在创建这样的东西:
public Foo() {
super();
}
public Object apply(Object x) {
return toString();
}
没有.withAssigner
调用,我得到:
java.lang.IllegalStateException: Cannot return class java.lang.String from public java.util.function.Function java.util.function.Function.compose(java.util.function.Function)
at net.bytebuddy.implementation.MethodCall$TerminationHandler$Simple$1.toStackManipulation(MethodCall.java:3005)
at net.bytebuddy.implementation.MethodCall$Appender.toStackManipulation(MethodCall.java:3551)
at net.bytebuddy.implementation.MethodCall$Appender.apply(MethodCall.java:3509)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyCode(TypeWriter.java:708)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod$WithBody.applyBody(TypeWriter.java:693)
at net.bytebuddy.dynamic.scaffold.TypeWriter$MethodPool$Record$ForDefinedMethod.apply(TypeWriter.java:600)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default$ForCreation.create(TypeWriter.java:5660)
at net.bytebuddy.dynamic.scaffold.TypeWriter$Default.make(TypeWriter.java:2166)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:232)
at net.bytebuddy.dynamic.scaffold.subclass.SubclassDynamicTypeBuilder.make(SubclassDynamicTypeBuilder.java:204)
at net.bytebuddy.dynamic.DynamicType$Builder$AbstractBase.make(DynamicType.java:3595)
我不是 ByteBuddy 内部的专家。为什么需要动态类型分配器才能返回 的子类型Object
?
解决方案
您正在拦截Function
. 当你认为你在拦截apply时,如果你仔细看,Byte Buddy是在抱怨这个compose
方法。指定一个显式匹配器来避免这种情况。
推荐阅读
- python - 在带有串行读取的树莓派上使用 os 库
- c# - 如果没有应用程序回收,在 ASP.NET 中使用后台工作人员有什么好处?
- c# - C# 检查进程并更改标签颜色
- c++ - c++ boost asio async_read_some 读取所有数据
- python - Python Matplotlib 子图颜色条
- sql-server - 在查询处理生命周期的什么时候评估运行时常量函数?
- javascript - npm start 得到 401 并且 node app.js 得到 200 响应
- javascript - React & Typescript:嵌套的 defaultProps 深度合并
- c# - C# 中 Xamarin.Forms 项目中的 SQLiteConnection 出现问题
- javascript - 使用 setInterval 循环时钟功能