java.lang.Object
jdk.jfr.EventFactory
运行时定义事件的类。
强烈建议在编译时定义事件,如果字段布局已知,这样Java虚拟机(JVM)可以优化代码,可能在飞行记录器未激活或者此事件的启用设置为false
时删除所有仪器。
要在编译时定义事件,请参见Event
。
以下示例展示了如何实现一个动态的Event
类。
List<ValueDescriptor> fields = new ArrayList<>();
List<AnnotationElement> messageAnnotations = Collections.singletonList(new AnnotationElement(Label.class, "Message"));
fields.add(new ValueDescriptor(String.class, "message", messageAnnotations));
List<AnnotationElement> numberAnnotations = Collections.singletonList(new AnnotationElement(Label.class, "Number"));
fields.add(new ValueDescriptor(int.class, "number", numberAnnotations));
String[] category = { "Example", "Getting Started" };
List<AnnotationElement> eventAnnotations = new ArrayList<>();
eventAnnotations.add(new AnnotationElement(Name.class, "com.example.HelloWorld"));
eventAnnotations.add(new AnnotationElement(Label.class, "Hello World"));
eventAnnotations.add(new AnnotationElement(Description.class, "Helps programmer getting started"));
eventAnnotations.add(new AnnotationElement(Category.class, category));
EventFactory f = EventFactory.create(eventAnnotations, fields);
Event event = f.newEvent();
event.set(0, "hello, world!");
event.set(1, 4711);
event.commit();
- 自 JDK 版本:
- 9
-
Method Summary
Modifier and TypeMethodDescriptionstatic EventFactory
create
(List<AnnotationElement> annotationElements, List<ValueDescriptor> fields) 创建一个EventFactory
对象。返回与此事件工厂关联的事件类型。newEvent()
实例化一个事件,以便可以填充数据并写入到飞行记录器系统中。void
register()
注册一个未注册的事件。void
注销与此事件工厂关联的事件。
-
Method Details
-
create
public static EventFactory create(List<AnnotationElement> annotationElements, List<ValueDescriptor> fields) 创建一个EventFactory
对象。值描述符的顺序指定了在设置事件值时要使用的索引。
- 参数:
-
annotationElements
- 描述事件上的注解的注解元素列表,不能为空 -
fields
- 描述事件字段的描述符列表,不能为空 - 返回:
- 事件工厂,不能为空
- 抛出:
-
IllegalArgumentException
- 如果输入无效。例如,如果字段类型或名称在Java语言中无效,或者注解元素引用无法找到的类型,则输入可能无效。 -
SecurityException
- 如果存在安全管理器且调用者没有FlightRecorderPermission("registerEvent")
- 参见:
-
newEvent
实例化一个事件,以便可以填充数据并写入到飞行记录器系统中。使用
Event.set(int, Object)
方法设置值。- 返回:
- 一个事件实例,不能为空
-
getEventType
返回与此事件工厂关联的事件类型。- 返回:
- 与此事件工厂关联的事件类型,不能为空
- 抛出:
-
IllegalStateException
- 如果事件工厂是使用Registered(false)
注解创建的,并且在调用此方法之前未手动注册事件类
-
register
public void register()注册一个未注册的事件。默认情况下,与此事件工厂关联的事件类在创建事件工厂时注册,除非事件具有
Registered
注解。已注册的事件类可以将数据写入到飞行记录器,并且可以通过调用
FlightRecorder.getEventTypes()
获取事件元数据。如果与此事件工厂关联的事件类已经注册,则对此方法的调用将被忽略。
- 抛出:
-
SecurityException
- 如果存在安全管理器且调用者没有FlightRecorderPermission("registerEvent")
- 参见:
-
unregister
public void unregister()注销与此事件工厂关联的事件。未注册的事件类无法将数据写入到飞行记录器,也无法通过调用
FlightRecorder.getEventTypes()
获取事件元数据。如果与此事件工厂关联的事件类尚未注册,则对此方法的调用将被忽略。
- 抛出:
-
SecurityException
- 如果存在安全管理器且调用者没有FlightRecorderPermission("registerEvent")
- 参见:
-