Когда я создаю подкласс класса в ByteBuddy, использует ли мой новый Dynami c класс те же модификаторы уровня класса, что и суперкласс? - PullRequest
1 голос
/ 19 марта 2020

Когда я делаю new ByteBuddy().subclass(something), а затем, в конце концов, make() и load(), получаются ли в результате у класса Dynami c те же самые модификаторы уровня типа, что и у суперкласса?

Например, если Я подкласс класса закрытого пакета, будет ли вновь созданный класс также закрытым для пакета?

Я спрашиваю, потому что я не вижу этого.

Если я вызову toTypeDescription() на DynamicType.Builder и затем getVisibility() на этом TypeDescription, я вижу Visibility.PUBLIC.

Обновление : я вижу это, только если я вызываю его до того, как позвоню на modifiers() с любым аргументом. Например, если я позвоню toTypeDescription().getVisibility() после Я позвонил modifiers(SyntheticState.SYNTHETIC), тогда сообщается о видимости PACKAGE_PRIVATE. Если я позвоню toTypeDescription().getVisibility() до Я позвонил modifiers(anything), тогда видимость будет PUBLIC. Я обнаружил, что это сбивает с толку, и хотел убедиться, что это предполагаемое поведение.

Я понимаю, что могу использовать ByteBuddy.modifiers() для установки любых модификаторов, которые я хочу. Но значения по умолчанию в этом случае (PUBLIC) меня удивили, учитывая, что ByteBuddy часто использует соглашение по конфигурации.

1 Ответ

0 голосов
/ 19 марта 2020

По умолчанию все сгенерированные классы публикуются c, не абстрактно. Я не ожидал бы никакого другого поведения, так как вы генерируете новый класс, и это наиболее распространенный способ его определения. При повторном преобразовании или повторном уточнении исходные модификаторы остаются в своем исходном состоянии.

Если вы вызываете .modifiers(SyntheticState.SYNTHETIC), вы заменяете модификаторы по умолчанию, где package-private является неявной видимостью языка Java. Установите Visibility.PUBLIC, чтобы преодолеть это. Если вы хотите добавить только модификатор, не касаясь несвязанных модификаторов, вы должны использовать .merge(SyntheticState.SYNTHETIC).

С .toTypeDescription() вы просто создаете описание текущего инструментированного типа.

...