Spec-Zone .ru
спецификации, руководства, описания, API
|
@Documented @Retention(value=RUNTIME) @Target(value=TYPE) public @interface MXBean
Аннотация, чтобы отметить интерфейс, явно как являющийся интерфейсом MXBean, или как не являющийся интерфейсом MXBean. По умолчанию интерфейс является интерфейсом MXBean, если его имя заканчивается MXBean
, как в SomethingMXBean
. Следующие интерфейсы являются интерфейсами MXBean:
public interface WhatsitMXBean {} @MXBean public interface Whatsit1Interface {} @MXBean(true) public interface Whatsit2Interface {}
Следующие интерфейсы не являются интерфейсами MXBean:
public interface Whatsit3Interface{} @MXBean(false) public interface MisleadingMXBean {}
Понятие MXBean обеспечивает простой способ кодировать MBean, который только ссылается на предопределенный набор типов, те определенные javax.management.openmbean
. Таким образом можно убедиться, что Ваш MBean будет применим любым клиентом, включая удаленные клиенты, без любого требования, чтобы у клиента был доступ к специфичным для модели классам, представляющим типы Вашего MBeans.
Понятия легче понять в сравнении со Стандартным понятием MBean. Вот то, как управляемый объект мог бы быть представлен как Стандартный MBean, и как MXBean:
Стандартный MBean | MXBean |
---|---|
public interface MemoryPoolMBean { String getName(); MemoryUsage getUsage(); // ... } |
public interface MemoryPoolMXBean { String getName(); MemoryUsage getUsage(); // ... } |
Как можно видеть, определения очень подобны. Единственная разница - то, что соглашение для того, чтобы назвать интерфейс состоит в том, чтобы использовать SomethingMXBean
для MXBeans, а не SomethingMBean
для Стандартного MBeans.
В этом управляемом объекте есть вызванный атрибут Usage
из типа MemoryUsage
. Точка атрибута как это - то, что он дает когерентный снимок ряда элементов данных. Например, это могло бы включать текущее количество используемой памяти в пуле памяти, и текущий максимум пула памяти. Если они были отдельными элементами, полученными с отдельным getAttribute
вызовы, тогда мы могли получить значения, замеченные в разное время, которые не были непротиворечивыми. Мы могли бы получить a used
значение, которое было больше чем max
значение.
Так, мы могли бы определить MemoryUsage
как это:
Стандартный MBean | MXBean |
---|---|
public class MemoryUsage implements Serializable { // standard JavaBean conventions with getters public MemoryUsage(long init, long used, long committed, long max) {...} long getInit() {...} long getUsed() {...} long getCommitted() {...} long getMax() {...} } |
public class MemoryUsage { // standard JavaBean conventions with getters @ConstructorProperties({"init", "used", "committed", "max"}) public MemoryUsage(long init, long used, long committed, long max) {...} long getInit() {...} long getUsed() {...} long getCommitted() {...} long getMax() {...} } |
Определения являются тем же самым в этих двух случаях, за исключением того, что с MXBean, MemoryUsage
больше потребности, которые будут отмечены Serializable
(хотя это может быть). С другой стороны мы добавили a @ConstructorProperties
аннотация, чтобы соединить параметры конструктора с соответствующими методами get. Мы будем видеть больше об этом ниже.
MemoryUsage
специфичный для модели класс. Со Стандартным MBeans клиент Сервера MBean не может получить доступ Usage
припишите, если это не знает класс MemoryUsage
. Предположите, что клиент является универсальной консолью, основанной на технологии JMX. Затем консоль должна была бы быть сконфигурирована со специфичными для модели классами каждого приложения, с которым она могла бы соединиться. Проблема еще хуже для клиентов, которые не пишутся на языке Java. Затем, возможно, нет никакого способа сказать клиенту что a MemoryUsage
похож.
Это - то, где MXBeans отличаются от Стандартного MBeans. Хотя мы определяем интерфейс управления в почти точно том же самом пути, платформа MXBean преобразовывает специфичные для модели классы в стандартные классы с платформы Java. Используя массивы и CompositeData
и TabularData
классы от стандарта javax.management.openmbean
пакет, возможно создать структуры данных произвольной сложности, используя только стандартные классы.
Это становится более четким, если мы сравниваем то, на что могли бы быть похожими клиенты этих двух моделей:
Стандартный MBean | MXBean |
---|---|
String name = (String)
mbeanServer. |
String name = (String) mbeanServer. |
Для атрибутов с простыми типами как String
, код является тем же самым. Но для атрибутов с составными типами, Стандартный код MBean требует, чтобы клиент знал специфичный для модели класс MemoryUsage
, в то время как код MXBean не требует никаких нестандартных классов.
Клиентский код, показанный здесь, немного более усложняется для клиента MXBean. Но, если клиент действительно фактически знает модель, здесь интерфейс MemoryPoolMXBean
и класс MemoryUsage
, тогда это может создать прокси. Это - рекомендуемый способ взаимодействовать с управляемыми объектами, когда Вы знаете модель заранее, независимо от того, используете ли Вы Стандартный MBeans или MXBeans:
Стандартный MBean | MXBean |
---|---|
MemoryPoolMBean proxy =
JMX. |
MemoryPoolMXBean proxy =
JMX. |
Реализация объекта MemoryPool работает так же и на Стандартный MBeans и на MXBeans.
Стандартный MBean | MXBean |
---|---|
public class MemoryPool implements MemoryPoolMBean { public String getName() {...} public MemoryUsage getUsage() {...} // ... } |
public class MemoryPool implements MemoryPoolMXBean { public String getName() {...} public MemoryUsage getUsage() {...} // ... } |
Регистрация MBean в Сервере MBean работает таким же образом в обоих случаях:
Стандартный MBean | MXBean |
---|---|
{
MemoryPoolMBean pool = new MemoryPool();
mbeanServer. |
{
MemoryPoolMXBean pool = new MemoryPool();
mbeanServer. |
MXBean является своего рода MBean. Объект MXBean может быть зарегистрирован непосредственно в Сервере MBean, или это может использоваться в качестве параметра StandardMBean
и результирующий MBean зарегистрировался в Сервере MBean.
Когда объект регистрируется в Сервере MBean, используя registerMBean
или createMBean
методы MBeanServer
интерфейс, класс объекта исследуется, чтобы определить, какой MBean это:
DynamicMBean
тогда MBean является Динамическим MBean. Отметьте что класс StandardMBean
реализации этот интерфейс, таким образом, этот случай применяется к Стандартному MBean или MXBean, создали использование класса StandardMBean
.SMXBean
где S
любая непустая строка, и не имейте аннотации @MXBean(false)
; и/или@MXBean(true)
или только @MXBean
.MemoryPoolMXBean
. NotCompliantMBeanException
. Каждый тип Java, который появляется как параметр или тип возврата метода в интерфейсе MXBean, должен быть конвертируемым использованием правил ниже. Дополнительно, параметры должны быть переконструируемыми как определено ниже.
Попытка создать MXBean, который не соответствует вышеупомянутым правилам, произведет исключение.
Те же самые соглашения о присвоении имен применяются к методам в MXBean как в Стандартном MBean:
T getN()
, где T
тип Java (нет void
) и N
непустая строка, определяет, что есть читаемый вызванный атрибут N
. Тип Java и Открытый тип атрибута определяются отображающимися правилами ниже. Метод final Class getClass()
наследованный от Object
игнорируется, ища методов get.boolean isN()
определяет, что есть читаемый вызванный атрибут N
с типом Java boolean
и Открытый тип SimpleType.Boolean
.void setN(T x)
определяет, что есть вызванный атрибут writeable N
. Тип Java и Открытый тип атрибута определяются отображающимися правилами ниже. (Конечно, имя x
из параметра не важно.)Правила для getN
и isN
все вместе определите понятие метода get. Правило для setN
определяет понятие метода set.
Это - ошибка для там, чтобы быть двумя методами get с тем же самым именем, или двумя методами set с тем же самым именем. Если есть метод get и метод set для того же самого имени, то тип T
в обоих должно быть то же самое. В этом случае атрибут является чтением-записью. Если есть только метод get или только метод set, атрибут только для чтения или только для записи соответственно.
MXBean является своего рода Открытым MBean, как определено javax.management.openmbean
пакет. Это означает, что типы атрибутов, параметров работы, и возвращаемых значений работы должны все быть поддающимся описанию использованием Открытые Типы, который является четырьмя стандартными подклассами OpenType
. MXBeans достигают этого, отображая типы Java в Открытые Типы.
Для каждого типа J Java отображение MXBean описывается следующей информацией:
OpenType
.Например, для типа Java List<String>
:
List<String>
), ArrayType
(1,
SimpleType.STRING
)
, представление 1-мерного массива String
s.List<String>
), String[]
.List<String>
может быть преобразован в a String[]
использование List.toArray(new String[0])
.String[]
может быть преобразован в a List<String>
использование Arrays.asList
.Если никакие правила отображения не существуют, чтобы получить opentype (J) из J, то J не может быть типом параметра метода или возвращаемого значения в интерфейсе MXBean.
Если есть способ преобразовать opendata (J) назад к J тогда, мы говорим, что J переконструируем. Все параметры метода в интерфейсе MXBean должны быть переконструируемыми, потому что, когда платформа MXBean вызывает метод, она должна будет преобразовать те параметры из opendata (J) к J. В прокси, сгенерированном JMX.newMXBeanProxy
, это - возвращаемые значения методов в интерфейсе MXBean, который должен быть переконструируемым.
Нулевые значения позволяются для всех типов Java и Открытых Типов, кроме примитивных типов Java, где они не возможны. Преобразовывая от типа J до типа opendata (J) или от типа opendata (J) к типу J, нулевое значение отображается на нулевое значение.
Следующая таблица суммирует правила отображения типа.
Тип J Java | opentype (J) | opendata (J) |
---|---|---|
int , boolean , и т.д.(8 примитивных типов Java) |
SimpleType.INTEGER ,SimpleType.BOOLEAN , и т.д. |
Integer , Boolean , и т.д.(соответствующие упакованные типы) |
Integer , ObjectName , и т.д.(типы, покрытые SimpleType ) |
соответствие SimpleType |
J, тот же самый тип |
int[] и т.д.(одномерный массив с примитивный тип элемента) |
ArrayType.getPrimitiveArrayType(int[].class) и т.д. |
J, тот же самый тип |
E[] (массив с непримитивным типом E элемента; это включает int[][] , где E int[] ) |
ArrayType.getArrayType( opentype (E)) |
opendata (E)[] |
List< E> Set< E> SortedSet< E> (см. ниже), |
то же самое что касается E[] |
то же самое что касается E[] |
Перечисление E (объявленный в Java как enum E
{...} ) |
SimpleType.STRING |
String |
Map< K, V> SortedMap< K, V> |
TabularType (см. ниже), |
TabularData (см. ниже), |
Интерфейс MXBean | SimpleType.OBJECTNAME (см. ниже), |
ObjectName (см. ниже), |
Любой другой тип | CompositeType , если возможный(см. ниже), |
CompositeData |
Следующие разделы дают более подробную информацию этих правил.
8 примитивных типов Java (boolean
, byte
, short
, int
, long
, float
, double
, char
) отображаются на соответствующие упакованные типы от java.lang
, а именно, Boolean
, Byte
, и т.д. Открытый Тип является соответствием SimpleType
. Таким образом, opentype (long
) SimpleType.LONG
, и opendata (long
) java.lang.Long
.
Массив типа примитива такой как long[]
может быть представлен непосредственно как Открытый Тип. Таким образом, openType (long[]
) ArrayType.getPrimitiveArrayType(long[].class)
, и opendata (long[]
) long[]
.
Практически, различие между плоскостью int
и Integer
, и т.д., не обнаруживается, потому что операции в API JMX всегда находятся на объектах Java, не примитивах. Однако, различие действительно обнаруживается с массивами.
List<
E>
и т.д.)A List<
E>
или Set<
E>
, такой как List<String>
или Set<ObjectName>
, отображается таким же образом как массив того же самого типа элемента, такой как String[]
или ObjectName[]
.
A SortedSet<
E>
также отображается таким же образом как E[]
, но это только конвертируемо, если E является классом, или взаимодействуйте через интерфейс, который реализует Comparable
. Таким образом, a SortedSet<String>
или SortedSet<Integer>
конвертируемо, но a SortedSet<int[]>
или SortedSet<List<String>>
не. Преобразование a SortedSet
экземпляр перестанет работать с IllegalArgumentException
если у этого есть ненуль comparator()
.
A List<
E>
восстанавливается как a java.util.ArrayList<
E>
; a Set<
E>
как a java.util.HashSet<
E>
; a SortedSet<
E>
как a java.util.TreeSet<
E>
.
Map<
K, V>
и т.д.)A Map<
K, V>
или SortedMap<
K, V>
, например Map<String,ObjectName>
, имеет Открытый Тип TabularType
и отображается на a TabularData
. TabularType
имеет два вызванные элемента key
и value
. Открытый Тип key
opentype (K), и Открытый Тип value
opentype (V). Индекс TabularType
единственный элемент key
.
Например, TabularType
для a Map<String,ObjectName>
мог бы быть создан с кодом как это:
String typeName = "java.util.Map<java.lang.String, javax.management.ObjectName>"; String[] keyValue = new String[] {"key", "value"}; OpenType[] openTypes = new OpenType[] {SimpleType.STRING, SimpleType.OBJECTNAME}; CompositeType rowType = new CompositeType(typeName, typeName, keyValue, keyValue, openTypes); TabularType tabularType = new TabularType(typeName, typeName, rowType, new String[] {"key"});
typeName
здесь определяется правилами имени типа, детализированными ниже.
A SortedMap<
K, V>
отображается таким же образом, но это только конвертируемо, если K является классом, или взаимодействуйте через интерфейс, который реализует Comparable
. Таким образом, a SortedMap<String,int[]>
конвертируемо, но a SortedMap<int[],String>
не. Преобразование a SortedMap
экземпляр перестанет работать с IllegalArgumentException
если у этого есть ненуль comparator()
.
A Map<
K, V>
восстанавливается как a java.util.HashMap<
K, V>
; a SortedMap<
K, V>
как a java.util.TreeMap<
K, V>
.
TabularData
интерфейс. Реальный класс, который используется, чтобы представить a Map<
K, V>
поскольку Открытые Данные TabularDataSupport
, или другая реализация класса TabularData
это сериализирует как TabularDataSupport
.
Интерфейс MXBean, или тип, на который ссылаются в пределах интерфейса MXBean, может сослаться на другой интерфейс MXBean, J. Затем opentype (J) SimpleType.OBJECTNAME
и opendata (J) ObjectName
.
Например, предположите, что у Вас есть два интерфейса MXBean как это:
public interface ProductMXBean { public ModuleMXBean[] getModules(); } public interface ModuleMXBean { public ProductMXBean getProduct(); }
Объект, реализовывая ModuleMXBean
соедините интерфейсом с возвратами из getProduct
метод объект, реализовывая ProductMXBean
интерфейс. ModuleMXBean
возразите и возвращенный ProductMXBean
объекты должны оба быть зарегистрированы как MXBeans в том же самом Сервере MBean.
Метод ModuleMXBean.getProduct()
определяет вызванный атрибут Product
. Открытый Тип для этого атрибута SimpleType.OBJECTNAME
, и соответствие ObjectName
значение будет именем под который ссылаемый ProductMXBean
регистрируется в Сервере MBean.
Если Вы заставляете MXBean проксировать для a ModuleMXBean
и вызовите getProduct()
метод, прокси отобразится ObjectName
назад в a ProductMXBean
делая другой прокси MXBean. Более формально, когда прокси, сделанный с JMX.newMXBeanProxy(mbeanServerConnection, objectNameX, interfaceX)
потребности отобразиться objectNameY
назад в interfaceY
, другой интерфейс MXBean, это делает так с JMX.newMXBeanProxy(mbeanServerConnection, objectNameY, interfaceY)
. Реализация может возвратить прокси, который ранее создавался звонком JMX.newMXBeanProxy
с теми же самыми параметрами, или это может создать новый прокси.
Обратное отображение иллюстрируется следующим изменением к ModuleMXBean
интерфейс:
public interface ModuleMXBean { public ProductMXBean getProduct(); public void setProduct(ProductMXBean c); }
Присутствие setProduct
метод теперь означает что Product
атрибут является чтением-записью. Как прежде, значение этого атрибута ObjectName
. Когда атрибут устанавливается, ObjectName
должен быть преобразован в ProductMXBean
возразите что setProduct
метод ожидает. Этот объект будет прокси MXBean для данного ObjectName
в том же самом Сервере MBean.
Если Вы заставляете MXBean проксировать для a ModuleMXBean
и вызовите setProduct
метод, прокси отобразит ProductMXBean
параметр назад в ObjectName
. Это будет только работать, если параметром будет фактически другой прокси для a ProductMXBean
в том же самом MBeanServerConnection
. Прокси мог быть возвращен из другого прокси (как ModuleMXBean.getProduct()
который возвращает прокси для a ProductMXBean
); или это могло быть создано JMX.newMXBeanProxy
; или это могло быть создано, используя Proxy
с обработчиком вызова, который является MBeanServerInvocationHandler
или подкласс.
Если те же самые MXBean были зарегистрированы под два отличающийся ObjectName
s, ссылка на это MXBean от другого MXBean был бы неоднозначен. Поэтому, если объект MXBean уже регистрируется в Сервере MBean, и попытка предпринимается, чтобы зарегистрировать его в том же самом Сервере MBean под другим именем, результат InstanceAlreadyExistsException
. Регистрации того же самого объекта MBean больше чем под одним именем обескураживают вообще, особенно потому что это не работает хорошо на MBeans, которые являются NotificationBroadcaster
s.
Учитывая класс Java или интерфейс J, который не соответствует другие правила в таблице выше, платформа MXBean попытается отобразить ее на a CompositeType
следующим образом. Имя типа этого CompositeType
определяется правилами имени типа ниже.
Класс исследуется на методов get, использующих соглашения выше. (Методы get должны быть общедоступными методами экземпляра.), Если нет никаких методов get, или если у какого-либо метода get есть тип, который не конвертируем, тогда J не конвертируем.
Если есть по крайней мере один метод get, и у каждого метода get есть конвертируемый тип, то opentype (J) является a CompositeType
с одним элементом для каждого метода get. Если метод get
T getName()
тогда элемент в CompositeType
вызывается name
и имеет тип opentype (T). Например, если элемент
String getOwner()
тогда элемент вызывают owner
и имеет Открытый Тип SimpleType.STRING
. Если метод get
boolean isName()
тогда элемент в CompositeType
вызывается name
и имеет тип SimpleType.BOOLEAN
.
Заметьте, что первый символ (или кодовая точка) преобразовывается в нижний регистр. Это следует за Бобовым соглашением Java, которое по историческим причинам отличается от Стандартного соглашения MBean. В Стандартном MBean или интерфейсе MXBean, методе getOwner
определяет вызванный атрибут Owner
, в то время как в Бобе Java или отображенный CompositeType
, метод getOwner
определяет свойство или вызванный элемент owner
.
Если два метода производят то же самое название товара (например, getOwner
и isOwner
, или getOwner
и getowner
) тогда тип не конвертируем.
Когда Открытый Тип CompositeType
, соответствующий отображенный тип Java (opendata (J)) CompositeData
. Отображение от экземпляра J к a CompositeData
соответствие CompositeType
только описанный делается следующим образом. Во-первых, если J реализует интерфейс CompositeDataView
, тогда тот интерфейс toCompositeData
метод вызывают, чтобы сделать преобразование. Иначе, CompositeData
создается, вызывая метода get для каждого элемента и преобразовывая это в соответствующий Открытый Тип данных. Таким образом, метод get такой как
List<String> getNames()
будет отображен на элемент с именем"names
"и Открытый Тип ArrayType(1, SimpleType.STRING)
. Преобразование в CompositeData
вызовет getNames()
и преобразуйте результант List<String>
в a String[]
для элемента"names
".
CompositeData
интерфейс. Реальный класс, который используется, чтобы представить тип как Открытые Данные, CompositeDataSupport
, или другая реализация класса CompositeData
это сериализирует как CompositeDataSupport
.
CompositeData
Если opendata (J) CompositeData
для типа J Java тогда любой экземпляр J может быть восстановлен от a CompositeData
, или J не переконструируем. Если любой элемент в CompositeData
не переконструируемо, тогда J не переконструируем также.
Для любого данного J, со следующими правилами консультируются, чтобы определить, как восстановить экземпляры J от CompositeData
. Первое применимое правило в списке является тем, которое будет использоваться.
Если у J есть метод
public static
J from(CompositeData cd)
тогда тот метод вызывают, чтобы восстановить экземпляр J.
Иначе, если у J есть по крайней мере один общедоступный конструктор с a ConstructorProperties
аннотация, тогда одного из тех конструкторов (не обязательно всегда тот же самый) вызовут, чтобы восстановить экземпляр J. Каждая такая аннотация должна перечислить так много строк, как у конструктора есть параметры; каждая строка должна назвать свойство, соответствующее методу get J; и тип этого метода get должен быть тем же самым как соответствующим параметром конструктора. Это не ошибка для там, чтобы быть методами get, которые не упоминаются в ConstructorProperties
аннотация (они могут соответствовать информации, которая не необходима, чтобы восстановить объект).
Экземпляр J восстанавливается, вызывая конструктора с соответствующими восстановленными элементами от CompositeData
. Конструктор, которого вызовут, будет определен во время выполнения, основанное на элементах, фактически существующих в CompositeData
, учитывая, что это CompositeData
мог бы прибыть из более ранней версии J, где не все элементы присутствовали. Конструктор применим если все свойства, названные в ConstructorProperties
аннотация присутствует как элементы в CompositeData
. Если никакой конструктор не применим, то попытка восстановить сбои J.
Для любой возможной комбинации свойств это должно иметь место, что или (a) там не являются никакими применимыми конструкторами, или (b), там точно один применимый конструктор, или (c), один из применимых конструкторов называет надлежащее надмножество свойств названным друг другом применимым конструктором. (Другими словами никогда не должно быть неоднозначности по который конструктор выбрать.), Если это условие не является истиной, то J не переконструируем.
Иначе, если у J есть общедоступный конструктор без аргументов, и для каждого метода get в J с типом T и именем N, там соответствующий метод set с тем же самым именем и типом, то экземпляр J создается с конструктором без аргументов, и методы set вызывают с восстановленными элементами от CompositeData
восстановить значения. Например, если есть метод
public List<String> getNames()
тогда должен также быть метод
public void setNames(List<String> names)
для этого правила применяться.
Если CompositeData
прибыл из более ранней версии J, некоторые элементы не могли бы присутствовать. В этом случае соответствующие методы set не вызовут.
Иначе, если J является интерфейсом, у которого нет никаких методов кроме методов get, экземпляр J создается, используя a Proxy
с a CompositeDataInvocationHandler
поддержанный CompositeData
быть преобразованным.
Иначе, J не переконструируем.
Вот примеры, показывая различные способы кодировать тип NamedNumber
это состоит из int
и a String
. В каждом случае, CompositeType
похож на это:
CompositeType
( "NamedNumber", // typeName "NamedNumber", // description new String[] {"number", "name"}, // itemNames new String[] {"number", "name"}, // itemDescriptions new OpenType[] {SimpleType.INTEGER, SimpleType.STRING} // itemTypes );
from
метод: public class NamedNumber { public int getNumber() {return number;} public String getName() {return name;} private NamedNumber(int number, String name) { this.number = number; this.name = name; } public static NamedNumber from(CompositeData cd) { return new NamedNumber((Integer) cd.get("number"), (String) cd.get("name")); } private final int number; private final String name; }
@ConstructorProperties
аннотация: public class NamedNumber { public int getNumber() {return number;} public String getName() {return name;} @ConstructorProperties({"number", "name"}) public NamedNumber(int number, String name) { this.number = number; this.name = name; } private final int number; private final String name; }
public class NamedNumber { public int getNumber() {return number;} public void setNumber(int number) {this.number = number;} public String getName() {return name;} public void setName(String name) {this.name = name;} public NamedNumber() {} private int number; private String name; }
public interface NamedNumber { public int getNumber(); public String getName(); }
Это обычно лучше для классов, которые просто представляют набор данных, чтобы быть неизменными. Экземпляр неизменного класса не может быть изменен после того, как он был создан. Заметьте это CompositeData
непосредственно является неизменным. У неизменности есть много преимуществ, особенно относительно потокобезопасности и безопасности. Таким образом, подхода, используя методы set нужно обычно избежать если возможный.
Рекурсивные (самосправочные) типы не могут использоваться в интерфейсах MXBean. Это - последствие неизменности CompositeType
. Например, следующий тип не мог быть типом атрибута, потому что это обращается к себе:
public interface Node { public String getName(); public int getPriority(); public Node getNext(); }
Всегда возможно переписать рекурсивные типы как это так, они больше не являются рекурсивными. Выполнение так может потребовать представляющих новых типов. Например:
public interface NodeList { public List<Node> getNodes(); } public interface Node { public String getName(); public int getPriority(); }
MXBean является типом Открытого MBean. Однако, по причинам совместимости, MBeanInfo
не OpenMBeanInfo
. В частности когда тип атрибута, параметра, или возвращаемого значения работы является типом примитива такой как int
, или void
(для типа возврата), тогда атрибут, параметр, или работа будут представлены соответственно MBeanAttributeInfo
, MBeanParameterInfo
, или MBeanOperationInfo
чей getType()
или getReturnType()
возвращает примитивное имя ("int
"и т.д.). Это так даже при том, что отображающиеся правила выше определяют, что отображение opendata является обернутым типом (Integer
и т.д.).
Массив общедоступных конструкторов, возвращенных MBeanInfo.getConstructors()
для MXBean, который непосредственно регистрируется в Сервере MBean, будет содержать всех общедоступных конструкторов этого MXBean. Если класс MXBean не общедоступен тогда, его конструкторов не считают общедоступными также. Список, возвращенный для MXBean, который создается, используя StandardMBean
класс получается таким же образом что касается Стандартного MBeans. Независимо от того, как был создан MXBean, его параметры конструктора не подвергаются MXBean отображающиеся правила и не имеют соответствия OpenType
.
Массив типов уведомления, возвращенных MBeanInfo.getNotifications()
для MXBean, который непосредственно регистрируется в Сервере MBean, будет пусто, если MXBean не реализует NotificationBroadcaster
интерфейс. Иначе, это будет результат вызова NotificationBroadcaster.getNotificationInfo()
в то время, когда MXBean был зарегистрирован. Даже если результат этого метода изменяется впоследствии, результат MBeanInfo.getNotifications()
не будет. Список, возвращенный для MXBean, который создается, используя StandardMBean
или StandardEmitterMBean
класс получается таким же образом что касается Стандартного MBeans.
Descriptor
для всего из MBeanAttributeInfo
, MBeanParameterInfo
, и MBeanOperationInfo
объекты, содержавшиеся в MBeanInfo
будет иметь поле openType
чье значение OpenType
определенный отображающимися правилами выше. Так даже когда getType()
"int
", getDescriptor().getField("openType")
будет SimpleType.INTEGER
.
Descriptor
поскольку у каждого из этих объектов также будет поле originalType
это - строка, представляющая тип Java, который появился в интерфейсе MXBean. Формат этой строки описывается в Именах типов раздела ниже.
Descriptor
для MBeanInfo
будет иметь поле mxbean
чье значение является строкой"true
".
Иногда неотображенный тип T параметра метода или возвращаемого значения в MXBean должен быть представлен как строка. Если T является неуниверсальным типом, эта строка является значением, возвращенным Class.getName()
. Иначе это - значение genericstring (T), определенный следующим образом:
Class.getName()
, например "int"
или "java.lang.String"
. "[]"
. Например, genericstring (int[]
) "int[]"
, и genericstring (List<String>[][]
) "java.util.List<java.lang.String>[][]"
. List<String>
и genericstring (T) состоит из следующего: полностью определенное имя параметризованного типа как возвращено Class.getName()
; левая угловая скобка ("<"
); genericstring (A), где A является первым параметром типа; если есть второй параметр типа B тогда ", "
(запятая и одиночный пробел) сопровождаемый genericstring (B); правая угловая скобка (">"
). Отметьте это, если метод возвращается int[]
, это будет представлено строкой "[I"
возвращенный Class.getName()
, но если метод возвращается List<int[]>
, это будет представлено строкой "java.util.List<int[]>"
.
Проблема с отображением от типов Java, чтобы Открыть типы сообщается с OpenDataException
. Это может произойти, когда интерфейс MXBean анализируется, например если он ссылается на тип как java.util.Random
у этого нет никаких методов get. Или это может произойти, когда экземпляр преобразовывается (возвращаемое значение из метода в MXBean или параметре к методу в прокси MXBean), например преобразовывая из SortedSet<String>
к String[]
если SortedSet
имеет ненуль Comparator
.
Проблема с отображением на типы Java от Открытых типов сообщается с InvalidObjectException
. Это может произойти, когда интерфейс MXBean анализируется, например если он ссылается на тип, который не переконструируем согласно правилам выше в контексте, где переконструируемый тип требуется. Или это может произойти, когда экземпляр преобразовывается (параметр в метод в MXBean или возвращаемом значении от метода в прокси MXBean), например от Строки до Перечисления, если нет никакой Перечислимой константы с тем именем.
В зависимости от контекста, OpenDataException
или InvalidObjectException
может быть обернут в другое исключение такой как RuntimeMBeanException
или UndeclaredThrowableException
. Для каждого выданного исключения условие C будет истиной: "e OpenDataException
или InvalidObjectException
(как соответствующий), или C верен для e.getCause()
".
Модификатор и Тип | Дополнительный Элемент и Описание |
---|---|
boolean |
значение
Истина, если аннотируемый интерфейс является интерфейсом MXBean.
|
Для дальнейшей ссылки API и документации разработчика, см.
Авторское право © 1993, 2011, Oracle и/или его филиалы. Все права защищены.