Spec-Zone.ru › OpenJDK 24

Интерфейс ClassFileTransformE,B>, E extends ClassFileElement, B extends ClassFileBuilderB>>

Параметры типа:
C - тип трансформации
E - тип элемента члена
B - тип билдера
Все известные подинтерфейсы:
ClassTransform, CodeTransform, FieldTransform, MethodTransform
public sealed interface ClassFileTransform<C extends ClassFileTransform<C,E,B>, E extends ClassFileElement, B extends ClassFileBuilder<E,B>> permits ClassTransform, FieldTransform, MethodTransform, CodeTransform
Преобразование CompoundElement путём обработки его отдельных элементов-членов и отправки результатов в ClassFileBuilder через ClassFileBuilder.transform(java.lang.classfile.CompoundElement<E>, java.lang.classfile.ClassFileTransform<?, E, B>). Для каждого подтипа CompoundElement и ClassFileBuilder определяется подтип ClassFileTransform, как показано в иерархии запечатанных классов ниже.

Например, это базовая трансформация CodeModel, которая перенаправляет все вызовы статических методов в классе Foo в класс Bar, сохраняя все остальные элементы:

CodeTransform fooToBar = (b, e) -> {
    if (e instanceof InvokeInstruction i
            && i.owner().name().equalsString("Foo")
            && i.opcode() == Opcode.INVOKESTATIC) {
        // remove the old element i by doing nothing to the builder
        // add a new invokestatic instruction to the builder
        b.invokestatic(CD_Bar, i.name().stringValue(), i.typeSymbol(), i.isInterface());
    } else {
        b.with(e);  // leaves the element in place
    }
};
Обратите внимание, что если преобразование элемента-члена не требуется, элемент следует представить builder::with. При отсутствии действий, этот элемент-член пропускается.

Более сложные примеры использования трансформаций включают обработку начала или конца, состояние преобразования, которое принимает решение на основе ранее встреченных элементов-членов, и составление трансформаций, где одна трансформация обрабатывает результаты предыдущей трансформации входной составной структуры. Все эти возможности поддерживаются этим интерфейсом и доступны для реализации пользовательских трансформаций.

Пользователи могут определить пользовательскую обработку начала и конца для трансформации путём переопределения atStart(B) и atEnd(B). Обработчик начала вызывается до обработки любого элемента-члена, а обработчик конца вызывается после обработки всех элементов-членов. Например, обработчик начала можно использовать для вставки дополнительных элементов кода в начало массива кода, а обработчик конца, в сочетании с поведением с состоянием, может выполнять действия по очистке, такие как определение, был ли объединён атрибут, или должен быть определён новый атрибут. Каждый подтип ClassFileTransform определяет служебный метод endHandler, который возвращает трансформация, имеющую только обработку конца.

Трансформации могут иметь состояния, сохраняющиеся при обработке отдельных элементов-членов. Например, если трансформация вставляет аннотацию, трансформация может отслеживать, столкнулась ли она с обновлённым RuntimeVisibleAnnotationsAttribute для билдера; если нет, то она может представить новый атрибут, содержащий только вставленную аннотацию в своём обработчике конца. Если такая трансформация должна быть общей или повторно использоваться, каждая возвращаемая трансформация должна иметь своё собственное состояние. Каждый подтип ClassFileTransform определяет служебный метод ofStateful, где поставщик создаёт трансформация в начальном состоянии каждый раз, когда трансформация повторно используется.

Трансформации могут быть объединены с помощью andThen(C). Когда эта трансформация объединяется с другой трансформацией, это означает, что выходные элементы-члены, полученные ClassFileBuilder, становятся входными элементами для другой трансформации. Объединение избегает построения промежуточных структур для выполнения нескольких трансформаций. Каждый подтип ClassFileTransform реализует andThen(C), который, как правило, не должен реализовываться пользователями.

Трансформации, работающие с более мелкими структурами, могут быть подняты до своих вмещающих структур для выборочного выполнения на всех вложенных структурах того же типа. Например, CodeTransform может быть поднята с помощью ClassTransform.transformingMethodBodies(Predicate, CodeTransform) для преобразования тела метода выбранных методов в классе, на котором она выполняется. Это позволяет пользователям писать небольшие трансформации и применять их к более широким масштабам.

Помимо ClassFileBuilder.transform(java.lang.classfile.CompoundElement<E>, java.lang.classfile.ClassFileTransform<?, E, B>), существуют и другие методы, которые удобно принимают трансформация, такие как ClassFile.transformClass(java.lang.classfile.ClassModel, java.lang.classfile.ClassTransform), ClassBuilder.transformField(java.lang.classfile.FieldModel, java.lang.classfile.FieldTransform), ClassBuilder.transformMethod(java.lang.classfile.MethodModel, java.lang.classfile.MethodTransform) или MethodBuilder.transformCode(java.lang.classfile.CodeModel, java.lang.classfile.CodeTransform). Это удобные методы, которые подходят для большинства сценариев трансформации.

График иерархии запечатанных классов:
Sealed class hierarchy graph for ClassFileTransformSealed class hierarchy graph for ClassFileTransform
С:
24

Краткое описание методов

Модификатор и тип Метод Описание
void accept(B builder, E element)
Преобразовать элемент, выполнив соответствующие действия с билдером.
C andThen(C next)
Цепочить эту трансформацию с другой; элементы, представленные билдеру этой трансформации, станут входом для следующей трансформации.
default void atEnd(B builder)
Выполнить любое завершающее действие во время трансформации сущности classfile.
default void atStart(B builder)
Выполнить любое предварительное действие во время трансформации сущности classfile.

Подробное описание методов

accept

void accept(B builder, E element)
Преобразовать элемент, выполнив соответствующие действия с билдером. Используется при преобразовании сущности classfile (класс, метод, поле, тело метода.) Если преобразование не требуется, элемент можно представить ClassFileBuilder.with(ClassFileElement). Если элемент нужно опустить, никаких действий не требуется.

Этот метод вызывается API class-файла. Пользователи никогда не должны вызывать этот метод.

Параметры:
builder - билдер для новой сущности
element - элемент

atEnd

default void atEnd(B builder)
Выполнить любое завершающее действие во время трансформации сущности classfile. Вызывается после того, как все элементы класса будут представлены accept(ClassFileBuilder, ClassFileElement).

Этот метод вызывается API class-файла. Пользователи никогда не должны вызывать этот метод.

Требования к реализации:
По умолчанию ничего не выполняется.
Параметры:
builder - билдер для новой сущности

atStart

default void atStart(B builder)
Выполнить любое предварительное действие во время трансформации сущности classfile. Вызывается до того, как любые элементы класса будут представлены accept(ClassFileBuilder, ClassFileElement).

Этот метод вызывается API class-файла. Пользователи никогда не должны вызывать этот метод.

Требования к реализации:
По умолчанию ничего не выполняется.
Параметры:
builder - билдер для новой сущности

andThen

C andThen(C next)
Цепочить эту трансформацию с другой; элементы, представленные билдеру этой трансформации, станут входом для следующей трансформации.

Этот метод реализуется API class-файла. Пользователи обычно не имеют достаточного доступа к функциональности API class-файла, чтобы правильно переопределить этот метод для общих трансформаций.

Параметры:
next - трансформация вниз по потоку
Возвращает:
цепная трансформация

© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/classfile/ClassFileTransform.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API