📄 introspector.java
字号:
/* * @(#)Introspector.java 1.68 03/12/19 * * Copyright 2004 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.jmx.mbeanserver;// Java importimport java.lang.reflect.Constructor;import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.ArrayList;import java.util.List;import java.util.Iterator;// RI Importimport javax.management.IntrospectionException;import javax.management.MBeanAttributeInfo;import javax.management.MBeanConstructorInfo;import javax.management.MBeanInfo;import javax.management.MBeanOperationInfo;import javax.management.MBeanParameterInfo;import javax.management.NotCompliantMBeanException;/** * This class contains the methods for performing all the tests needed to verify * that a class represents a JMX compliant MBean. * * @since 1.5 */public class Introspector { /* * ------------------------------------------ * PRIVATE VARIABLES * ------------------------------------------ */ private static final String attributeDescription = "Attribute exposed for management"; private static final String operationDescription = "Operation exposed for management"; private static final String constructorDescription = "Public constructor of the MBean"; private static final String mbeanInfoDescription = "Information on the management interface of the MBean"; /* * ------------------------------------------ * PRIVATE CONSTRUCTORS * ------------------------------------------ */ // private constructor defined to "hide" the default public constructor private Introspector() { // ------------------------------ // ------------------------------ } /* * ------------------------------------------ * PUBLIC METHODS * ------------------------------------------ */ /** * Tell whether a MBean of the given class is a Dynamic MBean. * This method does nothing more than returning * <pre> * javax.management.DynamicMBean.class.isAssignableFrom(c) * </pre> * This method does not check for any JMX MBean compliance: * <ul><li>If <code>true</code> is returned, then instances of * <code>c</code> are DynamicMBean.</li> * <li>If <code>false</code> is returned, then no further * assumption can be made on instances of <code>c</code>. * In particular, instances of <code>c</code> may, or may not * be JMX standard MBeans.</li> * </ul> * @param c The class of the MBean under examination. * @return <code>true</code> if instances of <code>c</code> are * Dynamic MBeans, <code>false</code> otherwise. * * @since.unbundled JMX RI 1.2 **/ public static final boolean isDynamic(final Class c) { // Check if the MBean implements the DynamicMBean interface return javax.management.DynamicMBean.class.isAssignableFrom(c); } /** * Basic method for testing that a MBean of a given class can be * instantiated by the MBean server.<p> * This method checks that: * <ul><li>The given class is a concrete class.</li> * <li>The given class exposes at least one public constructor.</li> * </ul> * If these conditions are not met, throws a NotCompliantMBeanException. * @param c The class of the MBean we want to create. * @exception NotCompliantMBeanException if the MBean class makes it * impossible to instantiate the MBean from within the * MBeanServer. * * @since.unbundled JMX RI 1.2 **/ public static void testCreation(Class c) throws NotCompliantMBeanException { // Check if the class is a concrete class final int mods = c.getModifiers(); if (Modifier.isAbstract(mods) || Modifier.isInterface(mods)) { throw new NotCompliantMBeanException("MBean class must be concrete"); } // Check if the MBean has a public constructor final Constructor[] consList = c.getConstructors(); if (consList.length == 0) { throw new NotCompliantMBeanException("MBean class must have public constructor"); } } /** * Basic method for testing if a given class is a JMX compliant MBean. * * @param baseClass The class to be tested * * @return <code>null</code> if the MBean is a DynamicMBean, * the computed {@link javax.management.MBeanInfo} otherwise. * @exception NotCompliantMBeanException The specified class is not a * JMX compliant MBean */ public static MBeanInfo testCompliance(Class baseClass) throws NotCompliantMBeanException { // ------------------------------ // ------------------------------ // Check if the MBean implements the MBean or the Dynamic // MBean interface if (isDynamic(baseClass)) return null; return testCompliance(baseClass, null); } /** * Basic method for testing if a given class is a JMX compliant MBean. * * @param baseClass The class to be tested * * @return <code>null</code> if the MBean is a DynamicMBean, * the computed {@link javax.management.MBeanInfo} otherwise. * @exception NotCompliantMBeanException The specified class is not a * JMX compliant MBean */ static MBeanInfo testCompliance(final Class baseClass, Class mbeanInterface) throws NotCompliantMBeanException { if (baseClass.isInterface()) throw new NotCompliantMBeanException(baseClass.getName() + " must be a class."); // ------------------------------ // ------------------------------ if (mbeanInterface == null) // No interface specified: look for default MBean interface. mbeanInterface = getStandardMBeanInterface(baseClass); else if (! mbeanInterface.isAssignableFrom(baseClass)) { // specified interface not implemented by given class final String msg = baseClass.getName() + " does not implement the " + mbeanInterface.getName() + " interface"; throw new NotCompliantMBeanException(msg); } else if (! mbeanInterface.isInterface()) { // Base class X, but XMBean is not an interface final String msg = baseClass.getName() + ": " + mbeanInterface.getName() + " is not an interface"; throw new NotCompliantMBeanException(msg); } if (mbeanInterface == null) { // Error: MBean does not implement javax.management.DynamicMBean // nor MBean interface final String baseClassName = baseClass.getName(); final String msg = baseClassName + " does not implement the " + baseClassName + "MBean interface or the DynamicMBean interface"; throw new NotCompliantMBeanException(msg); } final int mods = mbeanInterface.getModifiers(); if (!Modifier.isPublic(mods)) throw new NotCompliantMBeanException(mbeanInterface.getName() + " implemented by " + baseClass.getName() + " must be public"); return (introspect(baseClass, mbeanInterface)); } /** * Get the MBean interface implemented by a JMX standard MBean * class. * * @param baseClass The class to be tested * * @return The MBean interface implemented by the MBean. * Return <code>null</code> if the MBean is a DynamicMBean, * or if no MBean interface is found. * */ public static Class getMBeanInterface(Class baseClass) { // ------------------------------ // ------------------------------ // Check if the MBean implements the MBean or the Dynamic // MBean interface if (isDynamic(baseClass)) return null; return getStandardMBeanInterface(baseClass); } /** * Get the MBean interface implemented by a JMX standard MBean * class. * * @param baseClass The class to be tested * * @return The MBean interface implemented by the MBean. * Return <code>null</code> if no MBean interface is found. * Does not check whether the MBean is a DynamicMBean. * */ static Class getStandardMBeanInterface(Class baseClass) { // ------------------------------ // ------------------------------ Class current = baseClass; Class mbeanInterface = null; while (current != null) { mbeanInterface = findMBeanInterface(current, current.getName()); if (mbeanInterface != null) break; current = current.getSuperclass(); } return mbeanInterface; } /* * ------------------------------------------ * PRIVATE METHODS * ------------------------------------------ */ /** * Try to find the MBean interface corresponding to the class aName * - i.e. <i>aName</i>MBean, from within aClass and its superclasses. **/ private static Class findMBeanInterface(Class aClass, String aName) { Class current = aClass; while (current != null) { final Class[] interfaces = current.getInterfaces(); final int len = interfaces.length; for (int i=0;i<len;i++) { final Class inter = implementsMBean(interfaces[i], aName); if (inter != null) return inter;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -