我必须通过 mbean 访问某些应用程序,以便我可以更改其应用程序属性。现在我认为这可以通过两种方式完成:
首先,要么我要求该应用程序的开发人员在我的 mbean 将访问的数组列表中注册所有应用程序属性。
其次,如果有任何其他方式,例如开发人员只需要注册可编辑属性,我的 mbean 仍然可以访问可读/可编辑(r/w)应用程序属性。
现在,由于我不知道这些应用程序属性存储在 JVM 中的什么位置,有没有办法实现我的第二点,以便 mbean 只需要访问该对象并获取所有应用程序属性?
我必须通过 mbean 访问某些应用程序,以便我可以更改其应用程序属性。现在我认为这可以通过两种方式完成:
首先,要么我要求该应用程序的开发人员在我的 mbean 将访问的数组列表中注册所有应用程序属性。
其次,如果有任何其他方式,例如开发人员只需要注册可编辑属性,我的 mbean 仍然可以访问可读/可编辑(r/w)应用程序属性。
现在,由于我不知道这些应用程序属性存储在 JVM 中的什么位置,有没有办法实现我的第二点,以便 mbean 只需要访问该对象并获取所有应用程序属性?
似乎您在这里有一些相互矛盾的要求。
System.getProperty(...)
. 如果不是,那么我猜您只是在谈论各种对象中的字段。有(至少)两种方法可以做到这一点。在不知道您现在如何从源代码中导出 mbean 的情况下,我无法根据您的特定配置定制我的答案。我的回答将展示您如何使用我的SimpleJMX 包来公开您的属性。
如果您正在谈论,System.getProperty(...)
那么您可以编写一个可以查询任何属性并返回值的 JMX mbean:
@JmxOperation(description = "Query for property")
public String queryForProperty(String name) {
return System.getProperty(name);
}
相反,如果您需要从某个对象列表中导出字段,那么您要么必须为要导出的每个字段添加注释,要么必须编写通过委托导出字段的 bean。我看不到简单的方法,而且我知道没有任何软件包可以轻松地为您导出一系列对象,而无需提供有关要导出的内容和方式的某种信息。
使用 SimpleJMX,您可以通过注释字段或 get 方法来导出字段:
@JmxAttributeField(description = "Number of hits in the cache")
private int hitCount;
...
// this can also be specified as @JmxAttributeMethod on the getter/setter methods
@JmxAttributeMethod(description = "Number of misses in the cache")
private int getMissCount() {
return missCount;
}
@JmxAttributeField
支持一个isWritable = true
允许由 JMX 设置的值。您还可以使用注释设置器@JmxAttributeMethod
以使其可写。
如果您不想为每个类添加注释,那么您将不得不编写某种通过委托导出值的 JMX 容器类:
public class JmxPublisher {
private Class1 object1;
private Class2 object2;
...
public JmxPublisher(Class1 object1, Class2 object2) {
this.object1 = object1;
this.object2 = object2;
...
}
@JmxAttributeMethod(description = "Number of hits in the cache")
public int getClass1HitCount() {
return object1.getHitCount();
}
@JmxAttributeMethod(description = "Shutdown the background thread")
public void setClass2Shutdown(boolean shutdown) {
return object2.setShutdown(shutdown);
}
...
}
我也认为你应该更清楚地表达自己。
据我了解 - 为什么不提供一种查询远程应用程序的方法,并获取有关所有属性的信息,以及它们是只读、只写还是 RW?
这样在客户端应用程序的源代码中就不会提及属性列表——也许你应该让客户端应用程序的用户看到属性列表,让他编辑他可以编辑的属性,并阻止他编辑他不能的属性。