Tôi thấy rằng HotSpot liệt kê tất cả các đối số VM trong bean quản lý ngoại trừ -client và -server. Do đó, nếu bạn suy ra đối số -client / -server từ tên VM và thêm nó vào danh sách của bean quản lý thời gian chạy, bạn sẽ có được danh sách đầy đủ các đối số.
Đây là SSCCE:
import java.util.*;
import java.lang.management.ManagementFactory;
class main {
public static void main(final String[] args) {
System.out.println(fullVMArguments());
}
static String fullVMArguments() {
String name = javaVmName();
return (contains(name, "Server") ? "-server "
: contains(name, "Client") ? "-client " : "")
+ joinWithSpace(vmArguments());
}
static List<String> vmArguments() {
return ManagementFactory.getRuntimeMXBean().getInputArguments();
}
static boolean contains(String s, String b) {
return s != null && s.indexOf(b) >= 0;
}
static String javaVmName() {
return System.getProperty("java.vm.name");
}
static String joinWithSpace(Collection<String> c) {
return join(" ", c);
}
public static String join(String glue, Iterable<String> strings) {
if (strings == null) return "";
StringBuilder buf = new StringBuilder();
Iterator<String> i = strings.iterator();
if (i.hasNext()) {
buf.append(i.next());
while (i.hasNext())
buf.append(glue).append(i.next());
}
return buf.toString();
}
}
Có thể được thực hiện ngắn hơn nếu bạn muốn các đối số trong a List<String>
.
Lưu ý cuối cùng: Chúng tôi cũng có thể muốn mở rộng điều này để xử lý trường hợp hiếm gặp có khoảng trắng trong các đối số dòng lệnh.