前のエントリで、MBeanServerConnection#invokeを使って文字列でメソッド名を指定して処理を呼び出す方法のやり方がわかった。
でも、これならRMIの方がメソッド呼び出しとかタイプセーフっぽくてよくない?って思ってたらJMXにもありました。
javax.management.MBeanServerInvocationHandler#newProxyInstanceメソッドがそれっぽい。
とりあえず使ったコードは↓。サーバ側のコードは、前のエントリと同じです。
package kazuki.jmx;
import javax.management.MBeanServerConnection;
import javax.management.MBeanServerInvocationHandler;
import javax.management.ObjectName;
import javax.management.remote.JMXConnector;
import javax.management.remote.JMXConnectorFactory;
import javax.management.remote.JMXServiceURL;
public class ProxyClient {
public static void main(String[] args) throws Exception {
JMXServiceURL url = new JMXServiceURL(Server.ADDRESS);
JMXConnector connector = JMXConnectorFactory.connect(url);
MBeanServerConnection conn = connector.getMBeanServerConnection();
ObjectName name = new ObjectName("kazuki.jmx:type=HelloWorld");
// こいつでProxyを作成!
HelloWorld hello = MBeanServerInvocationHandler.newProxyInstance(
conn, name, HelloWorld.class, false);
// あぁタイプセーフ万歳
System.out.println(hello.sayHello());
}
}
うん。ばっちりだね!