// File: JMXFullDumper.java import javax.management.*; import javax.management.remote.JMXConnector; import javax.management.remote.JMXConnectorFactory; import javax.management.remote.JMXServiceURL; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import java.util.Set; import java.util.TreeSet; public class JMXFullDumper { public static void main(String[] args) { if (args.length < 1) { System.out.println("Usage: java JMXFullDumper [filter_keyword]"); System.out.println("Example: java JMXFullDumper service:jmx:rmi... Config"); System.out.println("If no filter_keyword is provided, all MBeans will be dumped."); return; } String url = args[0]; String filterKeyword = (args.length > 1) ? args[1] : ""; // Optional filter String username = "admin"; String password = "admin"; JMXConnector connector = null; try { JMXServiceURL serviceURL = new JMXServiceURL(url); Map env = new HashMap<>(); String[] credentials = {username, password}; env.put(JMXConnector.CREDENTIALS, credentials); System.out.println("[*] Connecting to JMX server at " + url); connector = JMXConnectorFactory.connect(serviceURL, env); MBeanServerConnection mbsc = connector.getMBeanServerConnection(); System.out.println("[+] Successfully connected to JMX server."); // Get all MBean names and sort them for clean output Set mbeanNames = new TreeSet<>(mbsc.queryNames(null, null)); System.out.println("[*] Found " + mbeanNames.size() + " total MBeans."); System.out.println("\n--- Dumping MBean Details (filtering for '" + filterKeyword + "') ---"); for (ObjectName name : mbeanNames) { // Apply the filter if (!filterKeyword.isEmpty() && !name.toString().toLowerCase().contains(filterKeyword.toLowerCase())) { continue; } System.out.println("\n======================================================================="); System.out.println(" MBean: " + name); System.out.println("======================================================================="); try { MBeanInfo mbeanInfo = mbsc.getMBeanInfo(name); // --- 1. DUMP ATTRIBUTES --- System.out.println(" [Attributes]"); MBeanAttributeInfo[] attributes = mbeanInfo.getAttributes(); if (attributes.length == 0) { System.out.println(" - None"); } for (MBeanAttributeInfo attr : attributes) { String attrDetails = String.format(" - %s (%s)", attr.getName(), attr.getType()); if (attr.isReadable()) { try { Object value = mbsc.getAttribute(name, attr.getName()); // Handle array types for cleaner printing String valueStr; if (value instanceof String[]) { valueStr = Arrays.toString((String[]) value); } else { valueStr = (value != null) ? value.toString() : "null"; } System.out.println(attrDetails + " = " + valueStr); } catch (Exception e) { System.out.println(attrDetails + " = [Error reading value: " + e.getMessage() + "]"); } } else { System.out.println(attrDetails + " [Write-Only]"); } } // --- 2. DUMP OPERATIONS --- System.out.println("\n [Operations]"); MBeanOperationInfo[] operations = mbeanInfo.getOperations(); if (operations.length == 0) { System.out.println(" - None"); } for (MBeanOperationInfo op : operations) { MBeanParameterInfo[] params = op.getSignature(); StringBuilder signature = new StringBuilder(); for (int i = 0; i < params.length; i++) { signature.append(String.format("%s %s", params[i].getType(), params[i].getName())); if (i < params.length - 1) { signature.append(", "); } } System.out.printf(" - %s %s(%s)\n", op.getReturnType(), op.getName(), signature.toString()); } } catch (Exception e) { System.err.println(" [!] Could not retrieve full info for this MBean: " + e.getMessage()); } } } catch (Exception e) { System.err.println("\n[!] An error occurred: " + e.getMessage()); e.printStackTrace(); } finally { if (connector != null) { try { connector.close(); System.out.println("\n[*] Connection closed."); } catch (Exception e) { System.err.println("Error closing connection: " + e.getMessage()); } } } } }