「Java」MBean に登録されている属性の型を調べる

MBean に登録されている属性を取得するのに MBeanServerConnection#getAttribute を使う方法があるわけですが、これが Object 型で値を返すので、適切な型にキャストしてやる必要があります。
「じゃあ、何型にキャストしてやればいいの?」となるので、その方法を調べてみました。

結論から言うと、

1. MBeanServerConnection#getMBeanInfo で MBeanInfo オブジェクトを取得する
2. MBeanInfo#getAttributes で MBeanAttributeInfo オブジェクトを取得する ( 配列で取れる )
3. MBeanAttributeInfo#getType を実行する

上記の順で MBeanAttributeInfo#getType の返り値を確認するといいみたいです。

ちょっと JBoss EAP 6.3 使って検証してみました。
スタンドアロンのアプリケーションでもいいですが、今回はサーブレットからで。
以下の感じのプログラムでいけました。

protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {

		String urlString = System.getProperty("jmx.service.url", "service:jmx:remoting-jmx://localhost:9999");
		JMXServiceURL serviceURL = new JMXServiceURL(urlString);
		JMXConnector jmxConnector = JMXConnectorFactory.connect(serviceURL, null);
		MBeanServerConnection connection = jmxConnector.getMBeanServerConnection();

		MBeanAttributeInfo[] attrs = null;
		try {
			ObjectName objectName = new ObjectName("jboss.as:subsystem=datasources,data-source=ExampleDS");
			MBeanInfo mbeanInfo = connection.getMBeanInfo(objectName);
			attrs = mbeanInfo.getAttributes();
		} catch (Exception e) {
			e.printStackTrace();
		}

		PrintWriter out = response.getWriter();
		out.println("<html><body>");
		for (MBeanAttributeInfo attr : attrs) {
			out.println(attr.getName() + " : " + attr.getType());
			out.println("<br>");
		}
		out.println("</body></html>");
	}

※ 属性の名前と対応する型の情報取得して出力してます。MBean はデフォルトのデータソース "ExampleDS" のもので。

■ 実行結果

sharePreparedStatements : java.lang.Boolean 
driverClass : java.lang.String 
preparedStatementsCacheSize : java.lang.Long 
spy : java.lang.Boolean 
password : java.lang.String 
maxPoolSize : java.lang.Integer 
 - 略 -

API ドキュメントは以下になりますね。

・MBeanServerConnection (Java Platform SE 7 )
http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanServerConnection.html
・MBeanInfo (Java Platform SE 7 )
http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanInfo.html
・MBeanAttributeInfo (Java Platform SE 7 )
http://docs.oracle.com/javase/7/docs/api/javax/management/MBeanAttributeInfo.html

JBoss での MBean サーバへのアクセスは以下のドキュメントに情報がある。

JMX subsystem configuration - JBoss AS 7.2 - Project Documentation Editor
https://docs.jboss.org/author/display/AS72/JMX+subsystem+configuration

[ 環境情報 ]
Windows 7 SP1
JBoss EAP 6.3
Java SE 7 Update 51

以上になります。

■ 備考
今回の件については、登録側のソース読むというのもひとつの手かもですが、場合によってはかなりの苦しい道のりになることもあるので・・・上記の方法の方がお手軽感がありますね。