Module jdk.jfr
Package jdk.jfr

Class EventFactory

java.lang.Object
jdk.jfr.EventFactory

public final class EventFactory extends Object
运行时定义事件的类。

强烈建议在编译时定义事件,如果字段布局已知,这样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 Details

    • create

      public static EventFactory create(List<AnnotationElement> annotationElements, List<ValueDescriptor> fields)
      创建一个EventFactory对象。

      值描述符的顺序指定了在设置事件值时要使用的索引。

      参数:
      annotationElements - 描述事件上的注解的注解元素列表,不能为空
      fields - 描述事件字段的描述符列表,不能为空
      返回:
      事件工厂,不能为空
      抛出:
      IllegalArgumentException - 如果输入无效。例如,如果字段类型或名称在Java语言中无效,或者注解元素引用无法找到的类型,则输入可能无效。
      SecurityException - 如果存在安全管理器且调用者没有FlightRecorderPermission("registerEvent")
      参见:
    • newEvent

      public Event newEvent()
      实例化一个事件,以便可以填充数据并写入到飞行记录器系统中。

      使用Event.set(int, Object)方法设置值。

      返回:
      一个事件实例,不能为空
    • getEventType

      public EventType getEventType()
      返回与此事件工厂关联的事件类型。
      返回:
      与此事件工厂关联的事件类型,不能为空
      抛出:
      IllegalStateException - 如果事件工厂是使用Registered(false)注解创建的,并且在调用此方法之前未手动注册事件类
    • register

      public void register()
      注册一个未注册的事件。

      默认情况下,与此事件工厂关联的事件类在创建事件工厂时注册,除非事件具有Registered注解。

      已注册的事件类可以将数据写入到飞行记录器,并且可以通过调用FlightRecorder.getEventTypes()获取事件元数据。

      如果与此事件工厂关联的事件类已经注册,则对此方法的调用将被忽略。

      抛出:
      SecurityException - 如果存在安全管理器且调用者没有FlightRecorderPermission("registerEvent")
      参见:
    • unregister

      public void unregister()
      注销与此事件工厂关联的事件。

      未注册的事件类无法将数据写入到飞行记录器,也无法通过调用FlightRecorder.getEventTypes()获取事件元数据。

      如果与此事件工厂关联的事件类尚未注册,则对此方法的调用将被忽略。

      抛出:
      SecurityException - 如果存在安全管理器且调用者没有FlightRecorderPermission("registerEvent")
      参见: