Статическая инициализация в наследуемом классе
В абстрактном классе имеется статический метод, который с помощью рефлексии и аннотаций выполняет построение экземпляра класса MBeanInfo как показано ниже (имплементация интерфейса DynamicMBean и переопределение методов класса NotificationBroadcasterSupport опущена для экономии места и как не относящаяся к вопросу):
public abstract class DynamicMBeanBase extends NotificationBroadcasterSupport implements DynamicMBean
{
private MBeanInfo mbeanInfo = null;
protected DynamicMBeanBase() throws IntrospectionException
{
super();
this.mbeanInfo = buildMBeanInfo( this.getClass() );
}
private static MBeanInfo buildMBeanInfo( final Class<?> cls ) throws IntrospectionException
{
// здесь логика построения MBeanInfo
}
}
Класс расширяющий DynamicMBeanBase выглядит следующим образом (имплементация интерфейса SimpleDynamicMBean, как и некоторых других методов, опущена для экономии места и как не относящаяся к вопросу):
@JmxBean( description = "Type \"Simple\" is used only for testing purposes" )
@JmxNotification(
name = "javax.management.AttributeChangeNotification",
description = "The notification occurs when any attribute of the Simple5 managed bean",
types = { AttributeChangeNotification.ATTRIBUTE_CHANGE }
)
public class Simple extends DynamicMBeanBase implements SimpleDynamicMBean
{
@JmxAttribute( name = "path", description = "Full file path to anything")
private String path;
public Simple() throws IntrospectionException
{
super();
}
@JmxOperation(
name = "sendMessage",
description = "Sends the specified message to the MBean server",
impactType = IMPACT_TYPES.UNKNOWN
)
@Override public void sendMessage(
@JmxParameter(
name = "message",
description = "message for sent to MBean server"
) final String message )
{
System.out.println( message );
}
}
Всё это, на мой взгляд, выглядит не очень... Помимо того, что приходиться явно создавать конструктор, так и экземпляр класса MBeanInfo создаётся каждый раз при создании нового экземпляра класса Simple. Так как информация об атрибутах, операциях, уведомлениях, именах параметров и описания доступны на этапе компиляции, то может быть имеется какой-либо способ однократного выполнения метода DynamicMBeanBase.buildMBeanInfo( Class<?> cls )?
Можно ли экземпляр класса MBeanInfo создавать в Simple единоразово?
Может быть какая-то хитрая статическая инициализация здесь поможет?
Ссылки по теме
- Класс MBeanInfo
- Интерфейс DynamicMBean
- Мониторинг и управление с использованием технологии JMX
- Java Dynamic Management Kit 5.0 > Dynamic MBeans