JMX即Java 管理扩展(Java Management Extensions,JMX)用来管理检测 Java 程序(同时 JMX 也在 J2EE 1.4 中被发布)它的作用是可以在程序运行的时候对其进行动态处理,调用相应方法来进行对指定属性值进行修改,在下面我将以代码结合jconsole进行分析(注意:在实际的程序管理过程中并不支持使用jconsole,因为它是一个java的客户端)源代码在下一节进行分析
1.1 tomcat中JMX的使用Demo
请注意这个JMX的展示仅仅针对与tomcat中的,因为tomcat对JMX做了改动,导致setter和getter方法不显示以及其他相关属性操作展示与原生jmx有所出入
1.1.1 java代码: 父类:
public class MbeanTestExtend { private String unSetGetAttrP; private String onlySetAttrP; private String onlyGetAttrP; private String includeSetGetAttrP; public void setOnlySetAttrP(String onlySetAttr) { this.onlySetAttrP = onlySetAttr; } public String getOnlyGetAttrP() { return onlyGetAttrP; } public String getIncludeSetGetAttrP() { return includeSetGetAttrP; } public void setIncludeSetGetAttrP(String includeSetGetAttrP) { this.includeSetGetAttrP = includeSetGetAttrP; } public String setAttrTestP(String attrTestP){ return "attrTestP"; } public void invokeMethodP(){ System.out.println("invokeMethodP..."); } }
子类:
public class MBeanTest extends MbeanTestExtend implements MBeanRegistration{ private String unSetGetAttr; private String onlySetAttr; private String onlyGetAttr; private String includeSetGetAttr; public void setOnlySetAttr(String onlySetAttr) { this.onlySetAttr = onlySetAttr; } public String getOnlyGetAttr() { return onlyGetAttr; } public String getIncludeSetGetAttr() { return includeSetGetAttr; } public void setIncludeSetGetAttr(String includeSetGetAttr) { this.includeSetGetAttr = includeSetGetAttr; } public String setAttrTest(String attrTest){ return "attrTest"; } public void invokeMethod(String value){ System.out.println("传入值:"+value); } public String getUnHandle(){ return "测试"; } public String getDomain(){ return "mainTest1"; } public static void main(String[] args) throws IOException { //MBeanServer实例能够用MBeanServerFactory类提供的方法获取 //MBeanServer mserver = null; MBeanTest mBeanTest = new MBeanTest(); mBeanTest.register(mBeanTest, "type=MBeanTest"); while (true){} } protected final ObjectName register(Object obj, String objectNameKeyProperties) { //根据domain构造一个对象名 形式一般 domain:type=className 这个最终构成 jmxStudy:type=mainTest //StringBuilder name = new StringBuilder(getDomain()); StringBuilder name = new StringBuilder("jmxStudy"); name.append(':'); name.append(objectNameKeyProperties); ObjectName on = null; try { //将上面构建的对象名字符串转化为对应的对象 on = new ObjectName(name.toString()); //获取MBeans建模注册表并注册组件 Registry.getRegistry(null, null).registerComponent(obj, on, null); } catch (MalformedObjectNameException e) { throw new RuntimeException(e.toString()); } catch (Exception e) { throw new RuntimeException(e.toString()); } return on; } @Override public ObjectName preRegister(MBeanServer server, ObjectName name) throws Exception { throw new RuntimeException("preRegister......."); } @Override public void postRegister(Boolean registrationDone) { throw new RuntimeException("postRegister......."); } @Override public void preDeregister() throws Exception { throw new RuntimeException("preDeregister......."); } @Override public void postDeregister() { throw new RuntimeException("postDeregister......."); } }
1.1.2 jconsole效果:
1.1.3 结论: 1.无setter和getter方法的变量不会显示 2.有getter方法无setter方法的即使没有变量会去掉前面get然后显示属性 3.有setter方法无getter方法且无变量的不会显示 4.有setter方法无getter方法存在变量的属性会显示 5.由1 2 3 4可知一个属性是否显示跟其句柄和setter/getter方法有关 6.一个属性显示后仅当具有getter方法的则这个属性可读,在值的地方会显示 7.一个属性显示后仅当具有setter方法的则这个属性可写,在值得地方输入新值会进行更新 8.一个操作方法必须满足一下的条件才能显示并且实现调用 ①public修饰 ②不是static方法 ③不是setter/getter方法 ④不是Object类中的方法(这是由于继承类中的方法也会被显示)
本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。
我来说两句