当我在 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(),您只是在创建当前检测类型的描述。