Если вы не используете [высоко динамичный] DynamicMBeans, я не понимаю, почему MBeanInfo нужно перестраивать для каждого вызова getMBeanInfo()
, но ....
Ваш LazyMBeanInfo может быть сделан дляработать (хотя я не проверял этот конкретный случай).MBeanInfo уже реализует Serializable, так что вы хотите, чтобы процесс сериализации записал MBeanInfo, а не LazyMBeanInfo, поскольку клиент, вероятно, не имеет этого класса в своем пути к классам.Однако LazyMBeanInfo может реализовать этот метод:
Object writeReplace() throws ObjectStreamException;
, после чего вы записываете базовый MBeanInfo.См. Сериализуемый JavaDoc, а именно:
Сериализуемые классы, которым необходимо указать альтернативный объект, который будет использоваться при записи объекта в поток, должны реализовать этот специальный метод с точной подписью:
ANY-ACCESS-MODIFIER Object writeReplace () throws ObjectStreamException;
Таким образом, фактический объект может быть экземпляром LazyMBeanInfo, но то, что вы записываете, может бытьфактический MBeanInfo, построенный из ваших кэшированных lazyAttrs.
Сказав, что вместо реализации подхода «сборка при первом вызове» я бы реализовал сборку перед первым использованием, просто создав полную MBeanInfo, когдаMBean сначала создается, или когда MBean зарегистрирован.Затем просто возвращайте предварительно созданный MBeanInfo при каждом вызове getMBeanInfo()
.
Чтобы сделать это во время регистрации MBean, внедрите интерфейс MBeanRegistration и создайте кэшированный MBeanInfo в postRegister метод.