📄 mbeaninstantiatorimpl.java
字号:
/* * @(#)MBeanInstantiatorImpl.java 1.31 05/05/27 * * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */package com.sun.jmx.mbeanserver;import java.lang.reflect.Constructor;import java.lang.reflect.InvocationTargetException;import java.io.*;import javax.management.*; import javax.management.loading.ClassLoaderRepository;import com.sun.jmx.trace.Trace;/** * Implements the MBeanInstantiator interface. Provides methods for * instantiating objects, finding the class given its name and using * different class loaders, deserializing objects in the context of a * given class loader. * * @since 1.5 * @since.unbundled JMX RI 1.2 */class MBeanInstantiatorImpl implements MBeanInstantiator { private final ModifiableClassLoaderRepository clr; // private MetaData meta = null; /** The name of this class to be used for tracing */ private final static String dbgTag = "MBeanInstantiatorImpl"; public MBeanInstantiatorImpl(ModifiableClassLoaderRepository clr) { this.clr = clr; } public void testCreation(Class c) throws NotCompliantMBeanException { Introspector.testCreation(c); } public Class findClassWithDefaultLoaderRepository(String className) throws ReflectionException { Class theClass; if (className == null) { throw new RuntimeOperationsException(new IllegalArgumentException("The class name cannot be null"), "Exception occured during object instantiation"); } try { if (clr == null) throw new ClassNotFoundException(className); theClass = clr.loadClass(className); } catch (ClassNotFoundException ee) { throw new ReflectionException(ee, "The MBean class could not be loaded by the default loader repository"); } return theClass; } public Class findClass(String className, ClassLoader loader) throws ReflectionException { return loadClass(className,loader); } public Class findClass(String className, ObjectName aLoader) throws ReflectionException, InstanceNotFoundException { Class theClass = null; if (aLoader == null) throw new RuntimeOperationsException(new IllegalArgumentException(), "Null loader passed in parameter"); // Retrieve the class loader from the repository ClassLoader loader = null; synchronized(this) { if (clr!=null) loader = clr.getClassLoader(aLoader); } if (loader == null) { throw new InstanceNotFoundException("The loader named " + aLoader + " is not registered in the MBeanServer"); } return findClass(className,loader); } public Class[] findSignatureClasses(String signature[], ClassLoader loader) throws ReflectionException { if (signature == null) return null; final ClassLoader aLoader = (ClassLoader) loader; final int length= signature.length; final Class tab[]=new Class[length]; if (length == 0) return tab; try { for (int i= 0; i < length; i++) { // Start handling primitive types (int. boolean and so // forth) // final Class primCla = StandardMetaDataImpl.findClassForPrim(signature[i]); if (primCla != null) { tab[i] = primCla; continue; } // Ok we do not have a primitive type ! We need to build // the signature of the method // if (aLoader != null) { // We need to load the class through the class // loader of the target object. // tab[i] = Class.forName(signature[i], false, aLoader); } else { // Load through the default class loader // tab[i] = findClass(signature[i], this.getClass().getClassLoader()); } } } catch (ClassNotFoundException e) { debugX("findSignatureClasses",e); throw new ReflectionException(e, "The parameter class could not be found"); } catch (RuntimeException e) { debugX("findSignatureClasses",e); throw e; } return tab; } public Object instantiate(Class theClass) throws ReflectionException, MBeanException { Object moi = null; // ------------------------------ // ------------------------------ Constructor cons = StandardMetaDataImpl.findConstructor(theClass, null); if (cons == null) { throw new ReflectionException(new NoSuchMethodException("No such constructor")); } // Instantiate the new object try { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPackageAccess(theClass.getName()); } moi= cons.newInstance((Object[]) null); } catch (InvocationTargetException e) { // Wrap the exception. Throwable t = e.getTargetException(); if (t instanceof RuntimeException) { throw new RuntimeMBeanException((RuntimeException)t, "RuntimeException thrown in the MBean's empty constructor"); } else if (t instanceof Error) { throw new RuntimeErrorException((Error) t, "Error thrown in the MBean's empty constructor"); } else { throw new MBeanException((Exception) t, "Exception thrown in the MBean's empty constructor"); } } catch (NoSuchMethodError error) { throw new ReflectionException(new NoSuchMethodException("No constructor"), "No such constructor"); } catch (InstantiationException e) { throw new ReflectionException(e, "Exception thrown trying to invoke the MBean's empty constructor"); } catch (IllegalAccessException e) { throw new ReflectionException(e, "Exception thrown trying to invoke the MBean's empty constructor"); } catch (IllegalArgumentException e) { throw new ReflectionException(e, "Exception thrown trying to invoke the MBean's empty constructor"); } return moi; } public Object instantiate(Class theClass, Object params[], String signature[], ClassLoader loader) throws ReflectionException, MBeanException { // Instantiate the new object // ------------------------------ // ------------------------------ final Class[] tab; Object moi= null; try { // Build the signature of the method // ClassLoader aLoader= (ClassLoader) theClass.getClassLoader(); // Build the signature of the method // tab = ((signature == null)?null: findSignatureClasses(signature,aLoader)); } // Exception IllegalArgumentException raised in Jdk1.1.8 catch (IllegalArgumentException e) { throw new ReflectionException(e, "The constructor parameter classes could not be loaded"); } // Query the metadata service to get the right constructor Constructor cons = null; cons= StandardMetaDataImpl.findConstructor(theClass, tab); if (cons == null) { throw new ReflectionException(new NoSuchMethodException("No such constructor")); } try { SecurityManager sm = System.getSecurityManager(); if (sm != null) { sm.checkPackageAccess(theClass.getName()); } moi = cons.newInstance(params); } catch (NoSuchMethodError error) { throw new ReflectionException(new NoSuchMethodException("No such constructor found"), "No such constructor" ); } catch (InstantiationException e) { throw new ReflectionException(e, "Exception thrown trying to invoke the MBean's constructor"); } catch (IllegalAccessException e) { throw new ReflectionException(e, "Exception thrown trying to invoke the MBean's constructor"); } catch (InvocationTargetException e) { // Wrap the exception. Throwable th = e.getTargetException(); if (th instanceof RuntimeException) { throw new RuntimeMBeanException((RuntimeException)th, "RuntimeException thrown in the MBean's constructor"); } else if (th instanceof Error) { throw new RuntimeErrorException((Error) th, "Error thrown in the MBean's constructor"); } else { throw new MBeanException((Exception) th, "Exception thrown in the MBean's constructor"); } } return moi; } public ObjectInputStream deserialize(ClassLoader loader, byte[] data)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -