//开启JMX远程访问接口 java.lang.System.setProperty("com.sun.management.jmxremote", "true"); java.lang.System.setProperty("com.sun.management.jmxremote.authenticate", "false"); java.lang.System.setProperty("com.sun.management.jmxremote.ssl", "false"); java.lang.System.setProperty("com.sun.management.jmxremote.port", "9999"); sun.management.Agent.startAgent(); //注册MBean MBeanServer mbs = ManagementFactory.getPlatformMBeanServer(); TestService svc = new TestService(); ObjectName name = new ObjectName("testjmx:type=TestService"); mbs.registerMBean(new StandardMBean(svc, typeof(TestMXBean)), name);
关键是这句: mbs.registerMBean(new StandardMBean(svc, typeof(TestMXBean)), name);
为管理对象提供一个StandardMBean代理,这个代理是在我们自己的程序集(dll或exe)中创建的,它能正确的调用重载接口的方法。是通过跟踪JDK自带管理MBean的创建过程发现的。
如果没有用StandardMBean封装,像Java中那样直接注册,会抛出javax.management.NotCompliantMBeanException异常
...
注:
有同学建议看了一篇参考文章,似乎是因为MBean是为基础类型准备的,而Java的基础类型在.NET平台IKVM下已经不是基础类型了,所以需要用MXBean代理,或者StandardMBean封装
https://blogs.oracle.com/jmxetc/entry/javax_management_standardmbean_when_and