当我在 ByteBuddy 中 subclass a class 时,我的新动态 class 是否使用与 superclass 相同的 class 级修饰符?
When I subclass a class in ByteBuddy, does my new dynamic class use the same class-level modifiers as the superclass?
当我执行 new ByteBuddy().subclass(something)
,然后最终执行 make()
和 load()
时,生成的动态 class 是否具有与 superclass?
例如,如果我子class一个私有包class,新生成的class是否也是私有包?
我问是因为我没有看到这个。
如果我在 DynamicType.Builder
上调用 toTypeDescription()
,然后在 TypeDescription
上调用 getVisibility()
,我会看到 Visibility.PUBLIC
。
Update:只有在使用 any 参数调用 modifiers()
之前调用它时,我才会看到它.例如,如果我在调用 modifiers(SyntheticState.SYNTHETIC)
之后调用 toTypeDescription().getVisibility()
,则报告的可见性为 PACKAGE_PRIVATE
。如果我在调用 toTypeDescription().getVisibility()
之前调用 我调用了 modifiers(anything)
,那么可见性是 PUBLIC
。我发现这令人困惑,想验证它是否是预期的行为。
我知道我可以使用 ByteBuddy.modifiers()
来设置我想要的任何修饰符。但是这种情况下的默认值 (PUBLIC
) 令我感到惊讶,因为 ByteBuddy 经常使用约定优于配置。
默认情况下,所有生成的 classes 都是 public,非抽象的。我不会期望任何其他行为,因为您正在生成一个新的 class,这是定义一个的最常见方式。如果您重新转换或重新调整,原始修改器将保持其原始状态。
如果您调用 .modifiers(SyntheticState.SYNTHETIC)
,您将替换默认修饰符,其中 package-private 是 Java 语言的隐式可见性。设置 Visibility.PUBLIC
来克服这个问题。如果你只想添加一个修饰符而不涉及不相关的修饰符,你应该使用 .merge(SyntheticState.SYNTHETIC)
.
使用 .toTypeDescription()
,您只是在创建当前检测类型的描述。
当我执行 new ByteBuddy().subclass(something)
,然后最终执行 make()
和 load()
时,生成的动态 class 是否具有与 superclass?
例如,如果我子class一个私有包class,新生成的class是否也是私有包?
我问是因为我没有看到这个。
如果我在 DynamicType.Builder
上调用 toTypeDescription()
,然后在 TypeDescription
上调用 getVisibility()
,我会看到 Visibility.PUBLIC
。
Update:只有在使用 any 参数调用 modifiers()
之前调用它时,我才会看到它.例如,如果我在调用 modifiers(SyntheticState.SYNTHETIC)
之后调用 toTypeDescription().getVisibility()
,则报告的可见性为 PACKAGE_PRIVATE
。如果我在调用 toTypeDescription().getVisibility()
之前调用 我调用了 modifiers(anything)
,那么可见性是 PUBLIC
。我发现这令人困惑,想验证它是否是预期的行为。
我知道我可以使用 ByteBuddy.modifiers()
来设置我想要的任何修饰符。但是这种情况下的默认值 (PUBLIC
) 令我感到惊讶,因为 ByteBuddy 经常使用约定优于配置。
默认情况下,所有生成的 classes 都是 public,非抽象的。我不会期望任何其他行为,因为您正在生成一个新的 class,这是定义一个的最常见方式。如果您重新转换或重新调整,原始修改器将保持其原始状态。
如果您调用 .modifiers(SyntheticState.SYNTHETIC)
,您将替换默认修饰符,其中 package-private 是 Java 语言的隐式可见性。设置 Visibility.PUBLIC
来克服这个问题。如果你只想添加一个修饰符而不涉及不相关的修饰符,你应该使用 .merge(SyntheticState.SYNTHETIC)
.
使用 .toTypeDescription()
,您只是在创建当前检测类型的描述。