Статическая инициализация в наследуемом классе

В абстрактном классе имеется статический метод, который с помощью рефлексии и аннотаций выполняет построение экземпляра класса 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 единоразово?
Может быть какая-то хитрая статическая инициализация здесь поможет?


Ссылки по теме


Ответы (0 шт):