1. 程式人生 > >Tomcat原始碼中ObjectName這個類的作用

Tomcat原始碼中ObjectName這個類的作用

      當我們研究Tomcat原始碼的時候,我們會發現Tomcat程式碼中好多類中都用到了ObjectName這個類來構造一個物件,由於Tomcat原始碼中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

相關推薦

Tomcat原始碼ObjectName這個作用

      當我們研究Tomcat原始碼的時候,我們會發現Tomcat程式碼中好多類中都用到了ObjectName這個類來構造一個物件,由於Tomcat原始碼中ObjectName這個類的註釋是英文的,

Android原始碼引用@hide出現引用異常的問題error: cannot find symbol

    自己開發的APP在Android中使用一些系統隱藏的類         編譯的時候報錯,出現如下異常 error: cannot find symbol import android.net.EthernetM

Mybatis框架SqlSessionFactory這個是用來幹嘛的?

首先SqlSessionFactory與SqlSession都是同一個介面 SqlSessionFactory是通過SqlSessionFactoryBuilder的build方法建立的 而build方法建立的是一個SqlSessionFactory的實現類,叫DefaultSqlS

java反射method的invoke方法作用

argument 方法 names 反射 java invoke 作用 odex table  首先Method類代表一個方法,所以invoke(調用)就是調用Method類代表的方法。它可以讓你實現動態調用,例如你可以動態的傳人參數。下面是一個簡單的例子。 1 2

OOP3(繼承作用域/構造函數與拷貝控制/繼承與容器)

-a 控制 拷貝控制 函數調用 iostream 分配 類繼承 導致 每一個 當存在繼承關系時,派生類的作用域嵌套在其基類的作用域之內。如果一個名字在派生類的作用域內無法正確解析,則編譯器將繼續在外層的基類作用域中尋找該名字的定義 在編譯時進行名字查找: 一個對象、引用

昊天善圈區淺談比特幣這個型區塊鏈應用技術的特點及作用

需要 偽造 利用 方式 出現 應用技術 指紋 資產 交易 比特幣是一種分期數字貨幣,可以說是區塊鏈技術應用的典型案例,比特幣是一種“稀缺資產”,需要通過“數字挖掘”(挖礦)來創建,比特幣由於資源稀缺,從出現到現在價值已上升了幾百倍。比特幣可以用於收集和交易。比特幣出現開創了

java--建立一個帶預設構造方法(即無參構造)的,在構造方法列印一條訊息"Hello Constructor";再為這個新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來

題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Person類 class Pe

如何在Eclipse檢視Java庫的原始碼以及相應的api

你的JDK安裝目錄下%Java_home%/src.zip檔案就是原始碼,解壓縮找到對應包下面的類即可。 如果是Eclipse開發,ctr+滑鼠左擊,出現不了原始碼的話,在彈出的檢視中點選attach source,選擇src.zip即可。     JDK API文件  

Java包裝作用及注意點

轉載地址: https://blog.csdn.net/liu_005/article/details/79585956 Java中對每種基本型別都有一個對應的包裝類,這裡主要講解包裝類的作用和包裝類使用時的一些注意點。 包裝類的作用 作用主要有以下兩方面:  - 編

深入研究Python-Flask原始碼:flask_encoderJSONEncoder(object)

小編從事python-flask框架的後端開發,為了吃透它,小編會不斷的深入研究原始碼,今天從 flask_encoder中JSONEncoder(object)類開始深入研究。 class JSONEncoder(object): """可擴充套件JSON <

Tomcat原始碼解析:Container的Pipeline和Valve

前言:     我們在上一篇部落格 中分析了關於tomcat處理請求的全過程,在最後的時候交給了當前Engine的pipeline去處理。     Engine.pipeline獲取了first_valve,然後執行其invoke方法,即完成了請求

C++非中和的static的作用

一、非類中的static 1、隱藏         static修飾全域性變數的時候,這個全域性變數只能在本檔案中訪問,不能在其它檔案中訪問,即便是extern外部宣告也不可以。static修飾一個函式,則這個函式的只能在本檔案中呼叫,不能被其他檔案呼

java--建立一個帶預設構造方法(即無參構造)的,在構造方法列印一條訊息"Hello Constructor";再為這個新增一個過載構造方法,令其接收一個字串引數,將其一起打印出來

題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Perso

webrtc 原始碼如何新新增一個

webrtc 原始碼中如何新新增一個類 webrtc 原始碼使用gn做構建指令碼,使用.ninja作為編譯指令碼,gn就類似於cmakelist.txt,而.ninja就類似於makefile,webrtc中的BUILD.gn就是構建指令碼gn檔案,構建的時候會通過BUILD.gn檔

Qt 學習之路 2(19):事件的接受與忽略(當重寫事件回撥函式時,時刻注意是否需要通過呼叫父的同名函式來確保原有實現仍能進行!有好幾個例子。為什麼要這麼做?而不是自己去手動呼叫這兩個函式呢?因為我們無法確認父類中這個處理函式有沒有額外的操作)

版本: 2012-09-29 2013-04-23 更新有關accept()和ignore()函式的相關內容。 2013-12-02 增加有關accept()和ignore()函式的示例。 上一章我們介紹了有關事件的相關內容。我們曾經提到,事件可以依情況接受和忽略。現在,我們就

併發包的BlockingQueue這個的介紹及使用

import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; i

在spring的過濾器注入實體(@autowire會失效可使用這個方法)

轉載:難得可貴的好文章 https://blog.csdn.net/chl191623691/article/details/78657638   首先,本文   絕對是好文!不止本文,作者的文章都是很經典的,希望大家給小編一個贊,關注一下! 今天在做使用者使用cookie自動登入

Java之建立一個帶預設構造方法(即無參構造)的,在構造方法列印一條訊息"Hello Constructor";再為這個新增一個過載構造方法,令其接收一個字串引數。

建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 效果如下: 附上程

深入研究Python-Flask原始碼:flask_sqlalchemySQLAlchemy(object)

小編從事python-flask框架的後端開發,為了吃透它,小編會不斷的深入研究原始碼,今天從 flask_sqlalchemy中SQLAlchemy(object)類開始深入研究。 class SQLALchemy(object): """ 該類用於將SQLAlche

開發日常小結(9):如何在專案定位列舉作用,並使用列舉?-- 列舉描述業務物件狀態的例項詳解

2018年4月11日列舉類在專案中,作為常量狀態經常被使用,剛剛開始接觸時還有點不適應,現在已經能夠靈活的使用了。【1】概念  先看一個簡單的列舉類。package enumcase; public enum SeasonEnum { SPRING,SUMMER,F