Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/345.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么JConsole上的某些方法被禁用_Java_Jmx_Jconsole_Mbeans - Fatal编程技术网

Java 为什么JConsole上的某些方法被禁用

Java 为什么JConsole上的某些方法被禁用,java,jmx,jconsole,mbeans,Java,Jmx,Jconsole,Mbeans,我可以看到jconsole上的一些方法被禁用 下面是com.sun.management.ThreadMXBean 对于这些MBean方法,没有指定任何关于可访问性部分的内容 我认为这是一个安全特性,但我无法得到一个具体的答案 这个问题显而易见的第二部分是如何创建自定义MBean实现,这些实现可以在jconsole上选择性地禁用 以下是系统配置: JConsole版本“1.7.0-b147” Java(TM)SE运行时环境(构建1.7.0-b147) Java HotSpot(TM)64位服务

我可以看到jconsole上的一些方法被禁用

下面是
com.sun.management.ThreadMXBean

对于这些MBean方法,没有指定任何关于可访问性部分的内容

我认为这是一个安全特性,但我无法得到一个具体的答案

这个问题显而易见的第二部分是如何创建自定义MBean实现,这些实现可以在jconsole上选择性地禁用

以下是系统配置:

JConsole版本“1.7.0-b147”

Java(TM)SE运行时环境(构建1.7.0-b147)

Java HotSpot(TM)64位服务器虚拟机(构建21.0-b17,混合模式)

编辑

禁用的方法可以从独立进程调用

    MBeanServer server = ManagementFactory.getPlatformMBeanServer();
    ObjectName name = new ObjectName("java.lang", "type", "Threading");
    String operationName = "getThreadAllocatedBytes";
    //1 is main thread
    Object[] params = {1};
    String[] signature = new String[]{"long"};
    Object result = server.invoke(name, operationName, params, signature);
    //Result is 682760 on my machine
    System.out.println(result);

原因稍微好一点,它们只对采用简单类型(int或string)的操作启用。禁用的操作会接受更复杂的类型,如数组(没有用于接受复杂类型的工具,更不用说可以将字符串转换为复杂类型的Spring属性编辑器了)

这是一个相关的问题:


更新:这是基于从OpenJDK站点查看JConsole的源代码,根据方法签名启用或禁用操作,并封装在方法-
sun.tools.JConsole.inspector.Utils.isEditable(字符串类型)
中。允许的类型有原语、原语包装器、原语数组,

+1有意义。你有任何官方文档的链接吗?在官方文档中没有找到,但在源代码中找到:-)-我添加了一个更新作为详细信息。我认为它只是原语、原语包装器和其他类,如BigDecimal.class、BigInteger.class、Number.class、String.class、ObjectName.class。如果允许使用基元数组,则长[]不应该有问题。是的,您是对的,这看起来像是一个完整的列表-基元、基元包装器、BigDecimal数组、BigInteger数组、Number数组、String数组、ObjectName数组。具体而言,数组参数不存在