<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    hengheng123456789

      BlogJava :: 首頁 :: 聯(lián)系 :: 聚合  :: 管理
      297 Posts :: 68 Stories :: 144 Comments :: 0 Trackbacks
    一、前言
     
      動(dòng)態(tài)MBean是在運(yùn)行期才定義它的屬性和方法,也就是說它有什么屬性和方法是可以動(dòng)態(tài)改變的。動(dòng)態(tài)MBean主要利用一些輔助類(構(gòu)造函數(shù)類MBeanConstructorInfo、屬性類MBeanAttributeInfo、方法類MBeanOperationInfo)來完成這個(gè)功能,所有的動(dòng)態(tài)MBean必須實(shí)現(xiàn)DynamicMBean接口。DynamicMBean寫好后,使用方法和第一篇文章中普通的MBean一樣。
     
      給出一個(gè)動(dòng)態(tài)MBean的實(shí)例,這個(gè)實(shí)例最初動(dòng)態(tài)構(gòu)了一個(gè)Name屬性及一個(gè)print方法,當(dāng)我們執(zhí)行它的print方法之后,又給此MBean新增了一個(gè)print1方法。實(shí)例的代碼如下:
    二、實(shí)例
    1、HelloDynamic類

    import java.lang.reflect.Constructor;
    import java.util.Iterator;
    import javax.management.Attribute;
    import javax.management.AttributeList;
    import javax.management.DynamicMBean;
    import javax.management.MBeanAttributeInfo;
    import javax.management.MBeanConstructorInfo;
    import javax.management.MBeanException;
    import javax.management.MBeanInfo;
    import javax.management.MBeanNotificationInfo;
    import javax.management.MBeanOperationInfo;
    import javax.management.MBeanParameterInfo;
    import javax.management.ReflectionException;

    /**
    ?* @author Sunny Peng
    ?* @author change by Chen.Gang, add a feature for dynamic add operation
    ?* @version 1.0
    ?*/
    public class HelloDynamic implements DynamicMBean {
    ??? //這是我們的屬性名稱
    ??? private String name;
    ??? private MBeanInfo mBeanInfo = null;
    ??? private String className;
    ??? private String description;
    ??? private MBeanAttributeInfo[] attributes;
    ??? private MBeanConstructorInfo[] constructors;
    ??? private MBeanOperationInfo[] operations;
    ??? MBeanNotificationInfo[] mBeanNotificationInfoArray;

    ??? public HelloDynamic() {
    ??????? init();
    ??????? buildDynamicMBean();
    ??? }

    ??? private void init() {
    ??????? className = this.getClass().getName();
    ??????? description = "Simple implementation of a dynamic MBean.";
    ??????? attributes = new MBeanAttributeInfo[1];
    ??????? constructors = new MBeanConstructorInfo[1];
    ??????? operations = new MBeanOperationInfo[1];
    ??????? mBeanNotificationInfoArray = new MBeanNotificationInfo[0];
    ??? }

    ??? private void buildDynamicMBean() {
    ??????? //設(shè)定構(gòu)造函數(shù)
    ??????? Constructor[] thisconstructors = this.getClass().getConstructors();
    ??????? constructors[0] = new MBeanConstructorInfo("HelloDynamic(): Constructs a HelloDynamic object", thisconstructors[0]);
    ??????? //設(shè)定一個(gè)屬性
    ??????? attributes[0] = new MBeanAttributeInfo("Name", "java.lang.String", "Name: name string.", true, true, false);
    ??????? //operate method 我們的操作方法是print
    ??????? MBeanParameterInfo[] params = null;//無參數(shù)
    ??????? operations[0] = new MBeanOperationInfo("print", "print(): print the name", params, "void", MBeanOperationInfo.INFO);
    ??????? mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
    ??? }

    ??? //動(dòng)態(tài)增加一個(gè)print1方法
    ??? private void dynamicAddOperation() {
    ??????? init();
    ??????? operations = new MBeanOperationInfo[2];//設(shè)定數(shù)組為兩個(gè)
    ??????? buildDynamicMBean();
    ??????? operations[1] = new MBeanOperationInfo("print1", "print1(): print the name", null, "void", MBeanOperationInfo.INFO);
    ??????? mBeanInfo = new MBeanInfo(className, description, attributes, constructors, operations, mBeanNotificationInfoArray);
    ??? }

    ??? public Object getAttribute(String attribute_name) {
    ??????? if (attribute_name != null)
    ??????????? return null;
    ??????? if (attribute_name.equals("Name"))
    ??????????? return name;
    ??????? return null;
    ??? }

    ??? public void setAttribute(Attribute attribute) {
    ??????? if (attribute == null)
    ??????????? return;
    ??????? String Name = attribute.getName();
    ??????? Object value = attribute.getValue();
    ??????? try {
    ??????????? if (Name.equals("Name")) {
    ??????????????? // if null value, try and see if the setter returns any exception
    ??????????????? if (value == null) {
    ??????????????????? name = null;
    ??????????????????? // if non null value, make sure it is assignable to the attribute
    ??????????????? } else if ((Class.forName("java.lang.String")).isAssignableFrom(value.getClass())) {
    ??????????????????? name = (String) value;
    ??????????????? }
    ??????????? }
    ??????? } catch (Exception e) {
    ??????????? e.printStackTrace();
    ??????? }
    ??? }

    ??? public AttributeList getAttributes(String[] attributeNames) {
    ??????? if (attributeNames == null)
    ??????????? return null;
    ??????? AttributeList resultList = new AttributeList();
    ??????? // if attributeNames is empty, return an empty result list
    ??????? if (attributeNames.length == 0)
    ??????????? return resultList;
    ??????? for (int i = 0; i < attributeNames.length; i++) {
    ??????????? try {
    ??????????????? Object value = getAttribute(attributeNames[i]);
    ??????????????? resultList.add(new Attribute(attributeNames[i], value));
    ??????????? } catch (Exception e) {
    ??????????????? e.printStackTrace();
    ??????????? }
    ??????? }
    ??????? return resultList;
    ??? }

    ??? public AttributeList setAttributes(AttributeList attributes) {
    ??????? if (attributes == null)
    ??????????? return null;
    ??????? AttributeList resultList = new AttributeList();
    ??????? // if attributeNames is empty, nothing more to do
    ??????? if (attributes.isEmpty())
    ??????????? return resultList;
    ??????? // for each attribute, try to set it and add to the result list if successfull
    ??????? for (Iterator i = attributes.iterator(); i.hasNext();) {
    ??????????? Attribute attr = (Attribute) i.next();
    ??????????? try {
    ??????????????? setAttribute(attr);
    ??????????????? String name = attr.getName();
    ??????????????? Object value = getAttribute(name);
    ??????????????? resultList.add(new Attribute(name, value));
    ??????????? } catch (Exception e) {
    ??????????????? e.printStackTrace();
    ??????????? }
    ??????? }
    ??????? return resultList;
    ??? }

    ??? public Object invoke(String operationName, Object params[], String signature[]) throws MBeanException, ReflectionException {
    ??????? // Check for a recognized operation name and call the corresponding operation
    ??????? if (operationName.equals("print")) {
    ??????????? //具體實(shí)現(xiàn)我們的操作方法print
    ??????????? System.out.println("Hello, " + name + ", this is HellDynamic!");
    ??????????? dynamicAddOperation();
    ??????????? return null;
    ??????? } else if (operationName.equals("print1")) {
    ??????????? System.out.println("這是動(dòng)態(tài)增加的一方法print1");
    ??????????? return null;
    ??????? } else {
    ??????????? // unrecognized operation name:
    ??????????? throw new ReflectionException(new NoSuchMethodException(operationName), "Cannot find the operation " + operationName + " in " + className);
    ??????? }

    ??? }

    ??? public MBeanInfo getMBeanInfo() {
    ??????? return mBeanInfo;
    ??? }
    }

    ?
    說明:

    ??? * 實(shí)現(xiàn)于接口DynamicMBean
    ??? * 借助于各種輔助類完成一個(gè)類的構(gòu)造。構(gòu)造函數(shù)類MBeanConstructorInfo、屬性類MBeanAttributeInfo、方法類MBeanOperationInfo
    ??? * 這里所有public方法是實(shí)現(xiàn)于DynamicMBean的。主要提供:setAttribute設(shè)置屬性、 getAttribute取得屬性、setAttributes設(shè)置一組屬性、getAttributes取得一組屬性、invoke方法調(diào)用、 getMBeanInfo MBeanServer由這個(gè)方法得到關(guān)鍵的MBean類的構(gòu)造信息。

    2、HelloAgent類
      
      前面說了HelloDynamic和普通MBean的使用方法是一樣的,因此HelloAgent和第一篇的HelloAgent基本一樣,就是把Hello改成HelloDynamic而已。為了實(shí)例完整,也一并帖出來吧。

    import javax.management.MBeanServerFactory;
    import javax.management.ObjectName;
    import com.sun.jdmk.comm.HtmlAdaptorServer;
    public class HelloAgent {
    ??? public static void main(String[] args) throws Exception {
    ??????? MBeanServer server = MBeanServerFactory.createMBeanServer();
    ??????? ObjectName helloName = new ObjectName("chengang:name=HelloDynamic");
    ??????? HelloDynamic hello = new HelloDynamic();
    ??????? server.registerMBean(hello, helloName);
    ??????? ObjectName adapterName = new ObjectName("HelloAgent:name=htmladapter,port=8082");
    ??????? HtmlAdaptorServer adapter = new HtmlAdaptorServer();
    ??????? server.registerMBean(adapter, adapterName);
    ??????? adapter.start();
    ??????? System.out.println("start.....");
    ??? }
    }

     
    3、運(yùn)行
     
      先運(yùn)行HelloAgent。再打開瀏覽器,輸入網(wǎng)址:http://localhost:8082/。單擊進(jìn)入“name=HelloDynamic ”項(xiàng),執(zhí)行print方法后再回到上一頁面你會(huì)發(fā)現(xiàn)又多了一個(gè)print1方法。
     
    4、總結(jié)
      動(dòng)態(tài)MBean的代碼稍顯復(fù)雜,但對(duì)于一些特殊需求的情況,它將顯示出強(qiáng)大威力。而且它還是模型MBeans(Model MBeans)的基礎(chǔ)。不過在一般的項(xiàng)目中,動(dòng)態(tài)MBean還是用得比較少,所謂利器深藏之而不用,非常時(shí)方現(xiàn)光芒。
    posted on 2006-08-29 11:07 哼哼 閱讀(1150) 評(píng)論(1)  編輯  收藏 所屬分類: JMX

    Feedback

    # re: 4、動(dòng)態(tài)MBean:DynamicMBean 2016-08-02 17:43 袁良錠
    最喜歡你這種的寫博客了。簡(jiǎn)潔,demo代碼又全。  回復(fù)  更多評(píng)論
      

    主站蜘蛛池模板: 无码精品人妻一区二区三区免费看 | 国产亚洲精品福利在线无卡一| 亚洲日韩精品国产3区| 最新猫咪www免费人成| 亚洲色大成网站www| 最近免费中文字幕视频高清在线看 | 亚洲冬月枫中文字幕在线看| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲国产高清视频| www视频免费看| 亚洲香蕉久久一区二区三区四区| 最新中文字幕免费视频| 亚洲AV无码男人的天堂| 亚洲精品国产精品乱码不卡| 在线观看免费视频一区| 久久久亚洲欧洲日产国码aⅴ | 91成人免费观看| 国产亚洲精品成人AA片| 在线日韩av永久免费观看| 一个人看的www在线免费视频| 国产成人精品日本亚洲专区61| 日韩精品免费在线视频| 亚洲欧洲中文日产| 四虎永久在线精品免费影视| jizz免费一区二区三区| 久久久久亚洲AV成人片| 免费看的成人yellow视频| 国产无限免费观看黄网站| 亚洲视频一区调教| 日本高清免费网站| baoyu777永久免费视频| 国产.亚洲.欧洲在线| 亚洲成a人一区二区三区 | 成人免费无码大片a毛片软件| 免费看美女午夜大片| 亚洲成在人天堂在线| 国产大片91精品免费看3| 免费一区二区无码东京热| 久久久久亚洲国产| 亚洲国产综合无码一区| 18禁无遮挡无码网站免费|