⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 introspector.java

📁 Mobile 应用程序使用 Java Micro Edition (Java ME) 平台
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
    }    /**     * Get the MBean interface implemented by a JMX Standard     * MBean class. This method is only called by the legacy     * code in "com.sun.management.jmx".     *     * @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 given class implements the MBean interface        // or the Dynamic MBean interface        if (isDynamic(baseClass)) return null;        try {            return getStandardMBeanInterface(baseClass);        } catch (NotCompliantMBeanException e) {            return null;        }    }    /**     * 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 Standard MBean.     *     * @throws NotCompliantMBeanException The specified class is     * not a JMX compliant Standard MBean.     */    public static Class getStandardMBeanInterface(Class baseClass)        throws NotCompliantMBeanException {        Class current = baseClass;        Class mbeanInterface = null;        while (current != null) {            mbeanInterface =                findMBeanInterface(current, current.getName());            if (mbeanInterface != null) break;            current = current.getSuperclass();        }        if (mbeanInterface != null) {            return mbeanInterface;        } else {            final String msg =                "Class " + baseClass.getName() +                " is not a JMX compliant Standard MBean";            throw new NotCompliantMBeanException(msg);        }    }    /**     * Get the MXBean interface implemented by a JMX MXBean class.     *     * @param baseClass The class to be tested.     *     * @return The MXBean interface implemented by the MXBean.     *     * @throws NotCompliantMBeanException The specified class is     * not a JMX compliant MXBean.     */    public static Class getMXBeanInterface(Class baseClass)        throws NotCompliantMBeanException {        try {            return MXBeanSupport.findMXBeanInterface(baseClass);        } catch (Exception e) {            throw throwException(baseClass,e);        }    }    /*     * ------------------------------------------     *  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;	    }	    current = current.getSuperclass();	}	return null;         }        public static Descriptor descriptorForElement(final AnnotatedElement elmt) {        if (elmt == null)            return ImmutableDescriptor.EMPTY_DESCRIPTOR;        final Annotation[] annots = elmt.getAnnotations();        return descriptorForAnnotations(annots);    }        public static Descriptor descriptorForAnnotations(Annotation[] annots) {        if (annots.length == 0)            return ImmutableDescriptor.EMPTY_DESCRIPTOR;        Map<String, Object> descriptorMap = new HashMap<String, Object>();        for (Annotation a : annots) {            Class<? extends Annotation> c = a.annotationType();            Method[] elements = c.getMethods();            for (Method element : elements) {                DescriptorKey key = element.getAnnotation(DescriptorKey.class);                if (key != null) {                    String name = key.value();                    Object value;                    try {                        value = element.invoke(a);                    } catch (RuntimeException e) {                         // we don't expect this - except for possibly                        // security exceptions?                         // RuntimeExceptions shouldn't be "UndeclaredThrowable".                        // anyway...                        //                        throw e;                    } catch (Exception e) {                        // we don't expect this                        throw new UndeclaredThrowableException(e);                    }                    value = annotationToField(value);                    Object oldValue = descriptorMap.put(name, value);                    if (oldValue != null && !equals(oldValue, value)) {                        final String msg =                            "Inconsistent values for descriptor field " + name +                            " from annotations: " + value + " :: " + oldValue;                        throw new IllegalArgumentException(msg);                    }                }            }        }                if (descriptorMap.isEmpty())            return ImmutableDescriptor.EMPTY_DESCRIPTOR;        else            return new ImmutableDescriptor(descriptorMap);    }        /**     * Throws a NotCompliantMBeanException or a SecurityException.     * @param notCompliant the class which was under examination     * @param cause the raeson why NotCompliantMBeanException should     *        be thrown.     * @return nothing - this method always throw an exception.     *         The return type makes it possible to write     *         <pre> throw throwException(clazz,cause); </pre>     * @throws SecurityException - if cause is a SecurityException     * @throws NotCompliantMBeanException otherwise.     **/    static NotCompliantMBeanException throwException(Class<?> notCompliant,            Throwable cause)             throws NotCompliantMBeanException, SecurityException {        if (cause instanceof SecurityException)             throw (SecurityException) cause;        if (cause instanceof NotCompliantMBeanException)            throw (NotCompliantMBeanException)cause;        final String classname =                 (notCompliant==null)?"null class":notCompliant.getName();        final String reason =                 (cause==null)?"Not compliant":cause.getMessage();        final NotCompliantMBeanException res =                 new NotCompliantMBeanException(classname+": "+reason);        res.initCause(cause);        throw res;    }    // Convert a value from an annotation element to a descriptor field value    // E.g. with @interface Foo {class value()} an annotation @Foo(String.class)    // will produce a Descriptor field value "java.lang.String"    private static Object annotationToField(Object x) {        // An annotation element cannot have a null value but never mind        if (x == null)            return null;        if (x instanceof Number || x instanceof String ||                x instanceof Character || x instanceof Boolean ||                x instanceof String[])            return x;        // Remaining possibilities: array of primitive (e.g. int[]),        // enum, class, array of enum or class.        Class<?> c = x.getClass();        if (c.isArray()) {            if (c.getComponentType().isPrimitive())                return x;            Object[] xx = (Object[]) x;            String[] ss = new String[xx.length];            for (int i = 0; i < xx.length; i++)                ss[i] = (String) annotationToField(xx[i]);            return ss;        }        if (x instanceof Class)            return ((Class<?>) x).getName();        if (x instanceof Enum)            return ((Enum) x).name();        // The only other possibility is that the value is another        // annotation, or that the language has evolved since this code        // was written.  We don't allow for either of those currently.        throw new IllegalArgumentException("Illegal type for annotation " +                "element: " + x.getClass().getName());    }        // This must be consistent with the check for duplicate field values in    // ImmutableDescriptor.union.  But we don't expect to be called very    // often so this inefficient check should be enough.    private static boolean equals(Object x, Object y) {        return Arrays.deepEquals(new Object[] {x}, new Object[] {y});    }    /**     * Returns the XXMBean interface or null if no such interface exists     *     * @param c The interface to be tested     * @param clName The name of the class implementing this interface     */    private static Class implementsMBean(Class c, String clName) {        String clMBeanName = clName + "MBean";	if (c.getName().equals(clMBeanName)) {	    return c;	}   	Class current = c;	Class[] interfaces = c.getInterfaces();	for (int i = 0;i < interfaces.length; i++) {            if (interfaces[i].getName().equals(clMBeanName))                return interfaces[i];	}		return null;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -