Module jdk.jfr
Package jdk.jfr

Class ValueDescriptor

java.lang.Object
jdk.jfr.ValueDescriptor

public final class ValueDescriptor extends Object
描述事件字段和注解元素。

以下示例显示了如何使用ValueDescriptor类列出所有类型的字段信息。

void printTypes() {
    Map<String, List<ValueDescriptor>> typeMap = new LinkedHashMap<>();
    for (EventType eventType : FlightRecorder.getFlightRecorder().getEventTypes()) {
        findTypes(typeMap, eventType.getName(), eventType.getFields());
    }
    for (String type : typeMap.keySet()) {
        System.out.println("Type: " + type);
        for (ValueDescriptor field : typeMap.get(type)) {
            System.out.println(" Field: " + field.getName());
            String arrayBrackets = field.isArray() ? "[]" : "";
            System.out.println("  Type: " + field.getTypeName() + arrayBrackets);
            if (field.getLabel() != null) {
                System.out.println("  Label: " + field.getLabel());
            }
            if (field.getDescription() != null) {
                System.out.println("  Description: " + field.getDescription());
            }
            if (field.getContentType() != null) {
                System.out.println("  Content Types: " + field.getContentType());
            }
        }
        System.out.println();
    }
}

void findTypes(Map<String, List<ValueDescriptor>> typeMap, String typeName, List<ValueDescriptor> fields) {
    if (!typeMap.containsKey(typeName)) {
        typeMap.put(typeName, fields);
        for (ValueDescriptor subField : fields) {
            findTypes(typeMap, subField.getTypeName(), subField.getFields());
        }
    }
}
自 JDK 9 起:
9
  • Constructor Details

    • ValueDescriptor

      public ValueDescriptor(Class<?> type, String name)

      构造值描述符,用于动态创建事件类型和注解。

      支持以下类型:

      • byte.class
      • short.class
      • int.class
      • long.class
      • char.class
      • float.class
      • double.class
      • boolean.class
      • String.class
      • Class.class
      • Thread.class

      名称必须是有效的 Java 标识符(例如,"maxThroughput")。有关更多信息,请参阅 Java 语言规范的第 3.8 和 3.9 节。

      参数:
      type - 类型,非null
      name - 名称,非null
      抛出:
      IllegalArgumentException - 如果名称不是有效的 Java 标识符
      SecurityException - 如果存在安全管理器且调用方没有FlightRecorderPermission("registerEvent")
    • ValueDescriptor

      public ValueDescriptor(Class<?> type, String name, List<AnnotationElement> annotations)

      构造值描述符,用于动态创建事件类型和注解。

      支持以下类型:

      • byte.class
      • short.class
      • int.class
      • long.class
      • char.class
      • float.class
      • double.class
      • boolean.class
      • String.class
      • Class.class
      • Thread.class

      名称必须是有效的 Java 标识符(例如,"maxThroughput")。有关更多信息,请参阅 Java 语言规范的第 3.8 和 3.9 节。

      参数:
      type - 类型,非null
      name - 名称,非null
      annotations - 值描述符上的注解,非null
      抛出:
      IllegalArgumentException - 如果名称不是有效的 Java 标识符
      SecurityException - 如果存在安全管理器且调用方没有FlightRecorderPermission("registerEvent")
  • Method Details

    • getLabel

      public String getLabel()
      返回描述该值的人类可读名称(例如,"最大吞吐量")。
      返回:
      人类可读名称,如果不存在则为null
    • getName

      public String getName()
      返回值的名称(例如,"maxThroughput")。
      返回:
      名称,非null
    • getDescription

      public String getDescription()
      返回描述该值的句子(例如,"事务系统中的最大吞吐量。每个新批次后值将被重置。")。
      返回:
      描述,如果不存在则为null
    • getContentType

      public String getContentType()
      返回指定由此ValueDescriptor表示的值如何解释或格式化的文本标识符。

      例如,如果值描述符的类型为float,事件值为0.5f,则"jdk.jfr.Percentage"的内容类型提示客户端该值为百分比,并应该呈现为"50%"

      JDK提供以下预定义的内容类型:

      • jdk.jfr.Percentage
      • jdk.jfr.Timespan
      • jdk.jfr.Timestamp
      • jdk.jfr.Frequency
      • jdk.jfr.Flag
      • jdk.jfr.MemoryAddress
      • jdk.jfr.DataAmount
      • jdk.jfr.NetworkAddress

      可以使用ContentType类创建用户定义的内容类型。

      返回:
      内容类型,如果不存在则为null
      参见:
    • getTypeName

      public String getTypeName()
      返回与此值描述符关联的类型的完全限定类名。
      返回:
      类型名称,非null
      参见:
    • getTypeId

      public long getTypeId()
      返回 Java 虚拟机(JVM)中该类型的唯一 ID。ID 在不同 JVM 实例之间可能不同。
      返回:
      类型 ID,非负数
    • isArray

      public boolean isArray()
      返回此值描述符是否为数组类型。
      返回:
      如果是数组类型则返回true,否则返回false
    • getAnnotation

      public <A extends Annotation> A getAnnotation(Class<A> annotationType)
      如果直接为此值描述符存在具有相同名称的注解元素,则返回指定类型的第一个注解,否则返回null
      类型参数:
      A - 要查询并返回的注解类型
      参数:
      annotationType - 对应于注解类型的 Class 对象,非null
      返回:
      如果直接存在指定注解类型的注解,则返回此元素的注解,否则返回null
    • getAnnotationElements

      public List<AnnotationElement> getAnnotationElements()
      返回此值描述符的注解元素的不可变列表。
      返回:
      注解列表,非null
    • getFields

      public List<ValueDescriptor> getFields()
      如果类型复杂,则返回值描述符的不可变列表,否则返回空列表。
      返回:
      值描述符列表,非null