Похоже, что у вас есть некоторые противоречивые требования здесь.
- Вы хотите изменить минимальный код в приложении.
- Вы хотите, чтобы выставляли все свойства для чтения и/или записи.
- Возможно, вы говорите о
System.getProperty(...)
. Если нет, то я предполагаю, что вы говорите только о полях в разных объектах.
Существует (по крайней мере) два способа сделать это. Не зная, как вы экспортируете mbeans из исходного кода прямо сейчас, я не могу адаптировать свой ответ к вашей конкретной конфигурации. Мой ответ вместо этого покажет, как вы можете использовать мой SimpleJMX package, чтобы разоблачить ваши свойства.
Если вы говорите о System.getProperty(...)
, то вы можете написать JMX MBean, который может запросить любое имущество и вернуть значение:
@JmxOperation(description = "Query for property")
public String queryForProperty(String name) {
return System.getProperty(name);
}
Если, вместо этого, вам нужно экспортировать полей из некоторого списка объектов, то вам придется либо добавлять аннотации к каждому из полей, которые вы экспортируете, либо вам придется писать бобы, которые экспортируют поля через делегирование. Я не вижу легкого пути, и я не знаю ни одного пакета, который будет легко экспортировать ряд объектов для вас без какой-либо информации о том, что нужно экспортировать и как.
Использование 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);
}
...
}
Пожалуйста, попробуйте выразить лучше ваш вопрос. Трудно читать и понимать большую часть неотформатированного текста ... – JuanZe
Что вы подразумеваете под «свойством»? Вы говорите системное свойство или поле объекта или что-то еще? – Gray