java.lang.Object
jdk.jfr.ValueDescriptor
描述事件字段和注解元素。
以下示例显示了如何使用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 Summary
ConstructorDescriptionValueDescriptor
(Class<?> type, String name) 构造值描述符,用于动态创建事件类型和注解。ValueDescriptor
(Class<?> type, String name, List<AnnotationElement> annotations) 构造值描述符,用于动态创建事件类型和注解。 -
Method Summary
Modifier and TypeMethodDescription<A extends Annotation>
AgetAnnotation
(Class<A> annotationType) 如果直接为此值描述符存在具有相同名称的注解元素,则返回指定类型的第一个注解,否则返回null
。返回此值描述符的注解元素的不可变列表。返回指定由此ValueDescriptor
表示的值如何解释或格式化的文本标识符。返回描述该值的句子(例如,"事务系统中的最大吞吐量。每个新批次后值将被重置。"
)。如果类型复杂,则返回值描述符的不可变列表,否则返回空列表。getLabel()
返回描述该值的人类可读名称(例如,"最大吞吐量"
)。getName()
返回值的名称(例如,"maxThroughput"
)。long
返回 Java 虚拟机(JVM)中该类型的唯一 ID。返回与此值描述符关联的类型的完全限定类名。boolean
isArray()
返回此值描述符是否为数组类型。
-
Constructor Details
-
ValueDescriptor
构造值描述符,用于动态创建事件类型和注解。
支持以下类型:
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
构造值描述符,用于动态创建事件类型和注解。
支持以下类型:
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
返回描述该值的人类可读名称(例如,"最大吞吐量"
)。- 返回:
-
人类可读名称,如果不存在则为
null
-
getName
返回值的名称(例如,"maxThroughput"
)。- 返回:
-
名称,非
null
-
getDescription
返回描述该值的句子(例如,"事务系统中的最大吞吐量。每个新批次后值将被重置。"
)。- 返回:
-
描述,如果不存在则为
null
-
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
返回与此值描述符关联的类型的完全限定类名。- 返回:
-
类型名称,非
null
- 参见:
-
getTypeId
public long getTypeId()返回 Java 虚拟机(JVM)中该类型的唯一 ID。ID 在不同 JVM 实例之间可能不同。- 返回:
- 类型 ID,非负数
-
isArray
public boolean isArray()返回此值描述符是否为数组类型。- 返回:
-
如果是数组类型则返回
true
,否则返回false
-
getAnnotation
如果直接为此值描述符存在具有相同名称的注解元素,则返回指定类型的第一个注解,否则返回null
。- 类型参数:
-
A
- 要查询并返回的注解类型 - 参数:
-
annotationType
- 对应于注解类型的 Class 对象,非null
- 返回:
-
如果直接存在指定注解类型的注解,则返回此元素的注解,否则返回
null
-
getAnnotationElements
返回此值描述符的注解元素的不可变列表。- 返回:
-
注解列表,非
null
-
getFields
如果类型复杂,则返回值描述符的不可变列表,否则返回空列表。- 返回:
-
值描述符列表,非
null
-