Интерфейс ClassFileTransform E, B>, E extends ClassFileElement, B extends ClassFileBuilder B>>
- Параметры типа:
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). Это удобные методы, которые подходят для большинства сценариев трансформации.
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
void |
accept |
Преобразовать элемент, выполнив соответствующие действия с билдером. |
C |
andThen |
Цепочить эту трансформацию с другой; элементы, представленные билдеру этой трансформации, станут входом для следующей трансформации. |
default void |
atEnd |
Выполнить любое завершающее действие во время трансформации сущности classfile. |
default void |
atStart |
Выполнить любое предварительное действие во время трансформации сущности classfile. |
Подробное описание методов
accept
void accept(B builder, E element)
ClassFileBuilder.with(ClassFileElement). Если элемент нужно опустить, никаких действий не требуется. Этот метод вызывается API class-файла. Пользователи никогда не должны вызывать этот метод.
- Параметры:
-
builder- билдер для новой сущности -
element- элемент
atEnd
default void atEnd(B builder)
accept(ClassFileBuilder, ClassFileElement). Этот метод вызывается API class-файла. Пользователи никогда не должны вызывать этот метод.
- Требования к реализации:
- По умолчанию ничего не выполняется.
- Параметры:
-
builder- билдер для новой сущности
atStart
default void atStart(B builder)
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