原文链接:https://blog.csdn.net/yunlong34574/article/details/46563187

ObjectName 就是存储了一个domain(域)下的一些属性,属性的存储采取key-value的方式来存储,这个类的一个精华所在就是domian及属性(key或者value)都是支持正则的,比如:*表示匹配所有,?表示匹配一个字符。

      一、ObjectName注释翻译

       ObjectName 表示一个Mbean的对象名称,或者是表示一个能够匹配几个Mbean的正则,ObjectName 的所有实例都是不可变的。

也就是说, ObjectName 类的实例能够用来表示:一个对象名称,或者一个正则对象,这个对象可以通过正则上下文来查询。

ObjectName由两部分组成,包括域(domain)和属性(properties)。域是一个不包含冒号的字符串,我们同时也推荐一个domain不应该包含“//”,因为这两个字符是为将来使用而预留的。如果在域中出现了通配符(*号)或者问号(?),那么这个ObjectName对象就是一个正则对象。通配符(*)匹配零个或者多个任意序列,而问号(?)则指匹配一个字符。

如果域是空的,那么ObjectName对象的域在某些环境中会被替换为Mbean的默认域,这么做的目的就是以便ObjectName能够被Mbean使用。

ObjectName对象的属性时一个无序的keys和values,一个key对应一个values。每一个key都是不包含逗号、等号、冒号、星号和问号的非空字符串,在同一个ObjectName对象中,不会出现相同的Key。与key关联的value,这个value要么没有引号,要么有引号。一个没有引号的value可能是一个不包含逗号、等号、冒号或者引号的空字符串。如果没有引号的value包含了通配符*号或者问号,那么说明这个ObjectName是一个正则value。通配符*号匹配零个或者多个字符序列,而问号则匹配一个字符。带有引号的value由双引号组成,双引号后边可能是一个空字符串,也可能是另外一个双引号。在这个字符串中,反斜杠有着特殊的意义。反斜杠后边必须紧跟着被下边的字符:

【1】如果紧跟着的是另一个反斜杠,第二个反斜杠没有特别的意义,所以这两个反斜杠表示一个反斜杠,因为第一个反斜杠是转义字符了。

【2】如果紧跟着的是一个字符'n',那么这两个字符表示一个换行符,也就是java中的"/n"的意思

【3】如果紧跟着的是一个双引号,那么这两个字符表示一个双引号,注意这个双引号并不是表示前一个双引号的终结。一个闭合的双引号必须表示一个合法的双引号值。

【4】如果紧跟着的是一个问号或者通配符(*),那么这两个字符在这里仅仅表示问号和星号,不再是正则的匹配符号了。

一个引号只有可能出现在奇数个反斜杠后边,否则在一个引号的值里面不会出现双引号。双引号括起来了带有双引号的value,在这个value中的任何反斜杠都被认为是分割这个value的。

如果带有双引号的值包含了通配符(*)或者问号,并且这两个符号没有被反斜杠预处理,那么他们则被认为是一个通配符。星号表示匹配零个或者多个字符串序列,而问号则匹配一个字符串。

一个ObjectName对象可能是一个属性列表匹配。在这种情况下,ObjectName可能没有或者有多个keys和关联的values。这个ObjectName能够匹配一个没有正则的ObjectName对象,没有正则的ObjectName的域与有正则的ObjectName的域匹,并且他们包含相同的keys和关联的values,同样他们可能包含相同的其他keys和values。

当一个ObjectName对象包含了一个双引号,或者没有引号时包含了上面描述的通配符,那么这个ObjectName就被认为是一个属性列表的模式匹配对象。在这种情况下,这个ObjectName包含了一个或者多个keys和关联的values,至少有一个value包含了通配符。他匹配了一个没有模式匹配的ObjectName对象,因为这两个ObjectName的域能够匹配,并且他们包含了值能够匹配的相同keys;如果这个属性值模式匹配是一个属性列表匹配,那么非模式匹配的Object对象也能够包含其他的keys和values。

当一个Object对象的Key是一个模式匹配,或者一个value是模式匹配,或者key和value都是模式匹配,那么这个对象则是一个属性模式匹配。

如果一个ObjectName对象的域包含了通配符,那么这个ObjectName对象就是一个模式匹配。如果一个ObjectName不是一个模式匹配对象,那么它必须至少包含一个key和这个key关联的value。

ObjectName模式匹配的示例:

【1】*:type=Foo,name=Bar

匹配任何域下的一个确定keys的集合。keys为:type=Foo,name=Bar

【2】d:type=Foo,name=Bar,*

匹配域“d”下有keys“ type=Foo,name=Bar ”加上零个或者多个其他keys。

【3】*:type=Foo,name=Bar,*

匹配任何域下有keys“ type=Foo,name=Bar ”加上零个或者多个其他keys。

【4】d:type=F?o,name=Bar

与“d:type=Foo,name=Bar”和“d:type=Fro,name=Bar”匹配一致

【5】d:type=F*o,name=Bar

与“d:type=Fo,name=Bar”和“d:type=Frodo,name=Bar”匹配一致

【6】d:type=Foo,name="B*"

与 d:type=Foo,name="Bling" 匹配一致,通配符是在引号里面,我们可以使用反斜杠“/”把特殊字符转化为普通字符。

一个ObjectName可以写成下面的格式:域:key属性列表。一个key属性列表可以写成用逗号分开的字符串。每个用逗号分割的字符串要么是一个通配符,要么是一个确定的key值。一个key属性值由key、等号和关联的value组成。

大部分key属性列表都是一个通配符,如果这个key属性列表包含了通配符,那么这个ObjectName是一个通配符属性。在一个ObjectName对象中,空格没有特别的意义。如下面的字符串:

domain: key1 = value1 , key2 = value2

上面的字符串表示一个Object对象,这个对象有两个key组成。每个key由6个字符组成,每个key都是从空格开始,以空格结尾。除了对上边指出的字符的限制,一个ObjectName中没有任何部分会包含换行符“/n”,包括:域、key、value、引用或者没有引号。但是换行符“/n”可以出现一个双引号序列的里面。无论我们使用哪个构造函数来构造ObjectName对象,上边的对特殊字符的规则都是适用的。

为了避免不同的人编写的不同的MBean之间的冲突,一个有效的约定就是域的名字采用机构dns的反向写法。例如:Sun Microsystems Inc公司的DNS名为sun.com,那么我可以定义域为com.sun.MyDomain,这个基本上跟java语言的包名字定义的约定是一致的。

      二、ObjectName的测试

 

package org.apache.catalina.manager;

import javax.management.MalformedObjectNameException;

import javax.management.ObjectName;

/**

 * 测试ObjectName对象

 * 

 * @author rey

 * 

 */

public class MyTest {

    /**

     * @param args

     * @throws NullPointerException

     * @throws MalformedObjectNameException

     */

    public static void main(String[] args) throws MalformedObjectNameException,

            NullPointerException {

        String sAnotherName ="d:type=F*o,name=Bar";

        ObjectName currObjectName = new ObjectName(sAnotherName);

        System.out.println(currObjectName.toString());

    }

}

输出结果:d:type=F*o,name=Bar

      三、ObjectName的源码可以从jdk中查看

            包路径为:javax.management.ObjectName

【转】JMX之ObjectName的更多相关文章

  1. Kafka使用jmxtrans+influxdb+grafana监控JMX指标

    最近在搞Kafka集群监控,之前也是看了网上的很多资料.之所以使用jmxtrans+influxdb+grafana是因为界面酷炫,可以定制化,缺点是不能操作Kafka集群,可能需要配合Kafka M ...

  2. JMX(Java Management Extension)学习

    目录 基本概念 MBean的种类 StandardMBean DynamicBean ModelMBean JMX的实现方式 StandardMBean的使用方法 JMX服务的访问方式 JMX--No ...

  3. presto 0.166概述

    presto是什么 是Facebook开源的,完全基于内存的并⾏计算,分布式SQL交互式查询引擎 是一种Massively parallel processing (MPP)架构,多个节点管道式执⾏ ...

  4. 利用jdk中工具完成Java程序监控方法记录

    转载加自己整理的部分内容,转载自:http://jiajun.iteye.com/blog/810150 记录下JConsole使用方法 一.JConsole是什么    从Java 5开始 引入了 ...

  5. ActiveMQ笔记(5):JMX监控

    系统上线运行后,及时监控报警是很必要的手段,对于ActiveMQ而言,主要监控的指标有:MQ本身的健康状况.每个队列的生产者数量.消费者数量.队列的当前消息数等. ActiveMQ支持JMX监控,使用 ...

  6. JMX

    一.为什么使用JMX,解决那些问题 举一个应用实例:在一个系统中常常会有一些配置信息,比如服务的IP地址,端口号什么的,那么如何来写这些代码呢? 写死在程序里,到要改变时就去改程序,然后再编译发布: ...

  7. jmx server 和jmx client

    启动jmx server 和jmx client,通过jconsole进入jmx server 然后通过其中远程进程,进入jmx client: 发现,两者可用的tab页不同, MBean的数量类型也 ...

  8. jmx完整示例

    很早就开始去了解这个了,不过一直都是皮毛,基本概念明白,具体api几乎一无不知... 认真看了几篇文章,做了测试,终于有所了解 参考 入门级别: http://www.cnblogs.com/agou ...

  9. spring源码分析之spring jmx

    JMX架构定义: https://docs.oracle.com/javase/8/docs/technotes/guides/jmx/overview/architecture.html Archi ...

随机推荐

  1. git 裸库

    初始化一个空的裸仓库 $ cd /home/repo $ mkdir tproject.git $ cd tproject.git $ git init - -bare      注:这是在服务器上运 ...

  2. spring boot 尚桂谷学习笔记08 Docker ---Web

    ------Docker------ 简介:Docker是一个开元的应用容器引擎,性能非常高 已经安装好的软件打包成一个镜像放到服务器中运行镜像 MySQL容器,Redis容器...... Docke ...

  3. Thymeleaf 遇到的问题

    1. 后台传递long类型的值作为 js 执行方法的参数,精准度失效解决办法 解决办法:用thymeleaf的拼接字符串方法来解决 例:<button class="btn btn-p ...

  4. ORCAL 数据库的约束以及SQL语言的四种类型

    oracle数据库约束: 定义:要输入的这个值是一个什么样的值, 或者是哪个范围内的值 作用: 确保完整性, 确保精确性 1, 非空约束(not null) 记录一条信息的时候如果用户名和密码没有被记 ...

  5. 【题解】A Horrible Poem

    题目大意 给出一个由小写英文字母组成的字符串 S,再给出 q 个询问,要求回答 S 某个子串的最短循环节. 如果字符串 B 是字符串 A 的循环节,那么 A 可以由 B 重复若干次得到. 输入格式 第 ...

  6. C#设计模式:状态者模式(State Pattern)

    一,什么是状态设计模式? 1,定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新. 2,当一个对象的内部状态改变时允许改变其行为,这个对象看起来像是 ...

  7. 十一、结构模式之享元(Flyweight)模式

    什么是享元模式 享元模式是对象的结构模式,是运用共享技术来有效的支持大量细粒度的对象.享元对象能做到共享的关键是区分内蕴状态和外蕴状态.一个内蕴状态是存储在享元对象内部,并且是不会随环境改变而有所不同 ...

  8. Android Paint类介绍以及浮雕和阴影效果的设置(转)

    转自:https://blog.csdn.net/lpjishu/article/details/45558375 Paint类介绍 Paint即画笔,在绘制文本和图形用它来设置图形颜色, 样式等绘制 ...

  9. (原)centos 防火墙开放端口命令

    centos 防火墙默认是关闭非系统端口的,所以用到非系统端口首先开放,命令如下 firewall-cmd --zone=public --add-port=1935/tcp --permanent ...

  10. js实用小函数收集

      格式化金额 var val='212312.235423' var rex = /\d{1,3}(?=(\d{3})+$)/g; val.replace(/^(-?)(\d+)((\.\d+)?) ...