我正在努力了解如何利用/使用MBeanInfo
(和相关MBeanAttributeInfo
,ModelMBeanInfo
等)并与之相关Descriptors
。
据我所知,MBean*Info
就像一个Class
对象,包含有关可用方法/属性/构造函数等的信息。另外,据我所知,这些信息是不可变的,并为我们在MBeanServer.registerMBean
或使用StandardMBean
类(可能MBeanServer实际使用StandardMbean
类?)的过程中使用反射生成此信息。这或多或少是正确的吗?
另外,我猜有一个ModelMBean
概念,我们可以通过编程方式传递我们自己的MBeanInfo
。如果通过带有反射的StandardMbean
可以实现同样的目的,那么这样做有什么意义呢?
最后,Descriptors
被允许用户通过以描述符的形式提供(名称,值)对来扩展mbeans的信息。这可以附加到任何MBean*Info
类(构造函数,属性,操作等)。但是,它可以在构造Info对象期间附加,因为它是不可变的。因此,使用StandardMbean
,它自己生成此信息,没有办法注入额外的信息,因为我们从MBeanInfo
得到的描述符也是不可变的...我在这里遗漏了什么?在MBean
上向构造函数/字段/方法的描述符添加额外信息的简单方法是什么?
答案 0 :(得分:1)
...此信息是不可变的,并在MBeanServer.registerMBean的过程中为我们生成,或者使用StandardMBean类...使用反射来生成此信息。这或多或少是正确的吗?
是。该信息是关于bean构建的,然后在服务器上注册,可以发布给客户端。不确定MBeanServer
是否会在封面下创建StandardMBean
。
如果可以通过带反射的StandardMbean实现同样的目的,那么这样做有什么意义呢?
MBean*Info
类允许您以编程方式将JMX映射发布到具体类型,而无需接口/ impl。这允许诸如Spring之类的外部包能够检测和发布调用已发现具有特殊@ManagedResource
属性的bean的JMX bean。
这也是我的SimpleJMX package能够使用其注释发布bean的方式。您需要做的就是将以下内容添加到您的某个类中,SimpleJMX以编程方式创建描述该类的MbeanInfo
个实例。您不需要自己定义JMX接口/ impl。
@JmxResource(description = "Lookup cache", domainName = "j256")
public class LookupCache {
@JmxAttributeField(description = "Number of hits in the cache")
private int hitCount;
...
在内部,SimpleJMX创建了一个实现javax.management.DynamicMBean
的类的实例。该接口公开了get,set,invoke动作方法。它还返回描述JMX发布类的MBeanInfo
。
我在这里遗漏了什么吗?在MBean上向构造函数/字段/方法的描述符添加额外信息的简单方法是什么?
我不会将Descriptors
与SimpleJMX
一起使用,因此我不知道它们是如何使用的。它们看起来是关于方法或参数的元信息,例如deprecated
,defaultValue
等。这似乎是静态信息,因此也是不可变的。