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_encoder中JSONEncoder(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_sqlalchemy中SQLAlchemy(object)類
小編從事python-flask框架的後端開發,為了吃透它,小編會不斷的深入研究原始碼,今天從 flask_sqlalchemy中SQLAlchemy(object)類開始深入研究。 class SQLALchemy(object): """ 該類用於將SQLAlche
開發日常小結(9):如何在專案中定位列舉類的作用,並使用列舉類?-- 列舉類描述業務物件狀態的例項詳解
2018年4月11日列舉類在專案中,作為常量狀態經常被使用,剛剛開始接觸時還有點不適應,現在已經能夠靈活的使用了。【1】概念 先看一個簡單的列舉類。package enumcase; public enum SeasonEnum { SPRING,SUMMER,F