Есть ли способ узнать, какие все java-опции используются java-приложением внутри JVM (например, те, которые передаются через командную строку)?
Я хочу найти его на лету, когдаприложение работает снаружи.
Map<String, String> env = System.getenv(); for (String envName : env.keySet()) { System.out.format("%s=%s%n", envName, env.get(envName)); }
Используйте JMX. Позволяет получать параметры, свойства и т. Д. Как изнутри, так и снаружи приложения.
Вы можете использовать JMX:
final JMXConnector connector = JMXConnectorFactory.connect(new JMXServiceURL(connectorAddress)); final MBeanServerConnection mBeanServerConnection = connector.getMBeanServerConnection(); final ObjectName commandLine = new ObjectName("java.lang:type=Runtime"); final List<Attribute> arguments = mBeanServerConnection.getAttributes(commandLine, new String[] {"InputArguments"}).asList(); String[] inputArguments = (String[]) arguments.get(0).getValue(); System.out.println(Arrays.asList(inputArguments)); connector.close();
Чтобы получить соединение JMX, вам может пригодиться мой ответ на вопрос " Клиент JMX, доступный только локально * ".
Я считаю, что Java не поддерживает «перехват» аргументов метода, аргументы метода не регистрируются и не перехватываются в JVM.
Однако вы легко можете распечатать аргументы, отправленные в работающий класс, используя пример System.env в другом ответе в этой теме.
ОДНАКО, если у вас есть контроль над исходным кодом реального приложения, вы можете следовать указаниям здесь: Как перехватить вызов метода стандартными функциями Java (без AspectJ и т. Д.)?
Это позволит вам регистрировать и перехватывать аргументы, отправляемые методу main.