Интерфейс аннотаций 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