Spec-Zone.ru › OpenJDK 21

Интерфейс аннотаций ContentType

@Target(ANNOTATION_TYPE) @Retention(RUNTIME) public @interface ContentType
Мета-аннотация, указывает, что аннотация представляет тип содержимого, такой как временной интервал или частота.

Следующий пример демонстрирует, как создать и использовать тип содержимого температуры.

Сначала объявите аннотацию температуры, используя аннотацию ContentType.

@MetadataDefinition
@ContentType
@Name("com.example.Temperature")
@Label("Temperature")
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Temperature {
    public final static String KELVIN = "KELVIN";
    public final static String CELSIUS = "CELSIUS";
    public final static String FAHRENEHIT = "FAHRENHEIT";

    String value() default CELSIUS;
}
Затем объявите событие, анимируйте поле и сохраните данные:
@Name("com.example.CPU")
@Label("CPU")
@Category({ "Hardware", "CPU" })
@Period("1 s")
@StackTrace(false)
static public class CPUEvent extends Event {
    @Label("ID")
    String id;

    @Temperature(Temperature.KELVIN)
    @Label("Temperature")
    float temperature;
}

public static void main(String... args) throws InterruptedException {
    FlightRecorder.addPeriodicEvent(CPUEvent.class, () -> {
        for (var cpu : listCPUs()) {
            CPUEvent event = new CPUEvent();
            event.id = cpu.id();
            event.temperature = cpu.temperature(); // in Kelvin
            event.commit();
        }
    });
    Thread.sleep(10_000);
}
Наконец, просмотрите аннотацию при отображении данных события:
void printTemperaturesInCelsius(Path file) throws IOException {
    for (RecordedEvent event : RecordingFile.readAllEvents(file)) {
        for (ValueDescriptor field : event.getEventType().getFields()) {
            for (AnnotationElement ae : field.getAnnotationElements()) {
                ContentType type = ae.getAnnotation(ContentType.class);
                if (type != null) {
                    if (ae.getTypeName().equals("com.example.Temperature")) {
                        double value = event.getDouble(field.getName());
                        String unit = (String) ae.getValue("value");
                        double celsius = switch (unit) {
                            case "CELSIUS" -> value;
                            case "KELVIN" -> value - 273.15;
                            case "FAHRENHEIT" -> (value - 32) / 1.8;
                            default -> throw new IllegalStateException("Unknown temperature unit '" + unit + "'");
                        };
                        System.out.println(celsius + " C");
                    } else {
                        System.err.println("Can't format content type " + ae.getTypeName() + " for field " + field.getName());
                    }
                }
            }
        }
    }
}
С:
9

© 1993, 2023, 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://docs.oracle.com/en/java/javase/21/docs/api/jdk.jfr/jdk/jfr/ContentType.html

Spec-Zone.ru

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