Java中ClassLoader类源码
来源:互联网 发布:java rpc框架哪个好 编辑:程序博客网 时间:2024/04/28 08:00
Java中ClassLoader类源码
public abstract class ClassLoader { private static native void registerNatives(); static { registerNatives(); } // The parent class loader for delegation private ClassLoader parent; // Hashtable that maps packages to certs private Hashtable package2certs = new Hashtable(11); // Shared among all packages with unsigned classes java.security.cert.Certificate[] nocerts; // The classes loaded by this class loader. The only purpose of this table // is to keep the classes from being GC'ed until the loader is GC'ed. private Vector classes = new Vector(); // The initiating protection domains for all classes loaded by this loader private Set domains = new HashSet(); // Invoked by the VM to record every loaded class with this loader. void addClass(Class c) { classes.addElement(c); } // The packages defined in this class loader. Each package name is mapped // to its corresponding Package object. private final HashMap<String, Package> packages = new HashMap<String, Package>(); private static Void checkCreateClassLoader() { SecurityManager security = System.getSecurityManager(); if (security != null) { security.checkCreateClassLoader(); } return null; } private ClassLoader(Void unused, ClassLoader parent) { this.parent = parent; } protected ClassLoader(ClassLoader parent) { this(checkCreateClassLoader(), parent); } protected ClassLoader() { this(checkCreateClassLoader(), getSystemClassLoader()); } public Class<?> loadClass(String name) throws ClassNotFoundException {return loadClass(name, false); } protected synchronized Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException {// First, check if the class has already been loadedClass c = findLoadedClass(name);if (c == null) { try {if (parent != null) { c = parent.loadClass(name, false);} else { c = findBootstrapClassOrNull(name);} } catch (ClassNotFoundException e) { // ClassNotFoundException thrown if class not found // from the non-null parent class loader } if (c == null) { // If still not found, then invoke findClass in order // to find the class. c = findClass(name); }}if (resolve) { resolveClass(c);}return c; } // This method is invoked by the virtual machine to load a class. private synchronized Class loadClassInternal(String name)throws ClassNotFoundException {return loadClass(name); } private void checkPackageAccess(Class cls, ProtectionDomain pd) {final SecurityManager sm = System.getSecurityManager();if (sm != null) { final String name = cls.getName(); final int i = name.lastIndexOf('.'); if (i != -1) { AccessController.doPrivileged(new PrivilegedAction() { public Object run() { sm.checkPackageAccess(name.substring(0, i)); return null; } }, new AccessControlContext(new ProtectionDomain[] {pd})); }}domains.add(pd); } protected Class<?> findClass(String name) throws ClassNotFoundException {throw new ClassNotFoundException(name); } @Deprecated protected final Class<?> defineClass(byte[] b, int off, int len)throws ClassFormatError {return defineClass(null, b, off, len, null); } protected final Class<?> defineClass(String name, byte[] b, int off, int len)throws ClassFormatError {return defineClass(name, b, off, len, null); } private ProtectionDomain preDefineClass(String name, ProtectionDomain protectionDomain) {if (!checkName(name)) throw new NoClassDefFoundError("IllegalName: " + name);if ((name != null) && name.startsWith("java.")) { throw new SecurityException("Prohibited package name: " +name.substring(0, name.lastIndexOf('.')));}if (protectionDomain == null) { protectionDomain = getDefaultDomain();}if (name != null) checkCerts(name, protectionDomain.getCodeSource());return protectionDomain; } private String defineClassSourceLocation(ProtectionDomain protectionDomain) {CodeSource cs = protectionDomain.getCodeSource();String source = null;if (cs != null && cs.getLocation() != null) { source = cs.getLocation().toString();}return source; } private Class defineTransformedClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain, ClassFormatError cfe, String source, boolean verify) throws ClassFormatError { // Class format error - try to transform the bytecode and // define the class again // Object[] transformers = ClassFileTransformer.getTransformers();Class c = null;for (int i = 0; transformers != null && i < transformers.length; i++) { try { // Transform byte code using transformer byte[] tb = ((ClassFileTransformer) transformers[i]).transform(b, off, len); c = defineClass1(name, tb, 0, tb.length, protectionDomain, source, verify); break; } catch (ClassFormatError cfe2){ // If ClassFormatError occurs, try next transformer }}// Rethrow original ClassFormatError if unable to transform// bytecode to well-formed//if (c == null) throw cfe;return c; } private void postDefineClass(Class c, ProtectionDomain protectionDomain) {if (protectionDomain.getCodeSource() != null) { java.security.cert.Certificate certs[] =protectionDomain.getCodeSource().getCertificates(); if (certs != null)setSigners(c, certs);} } protected final Class<?> defineClass(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain)throws ClassFormatError { return defineClassCond(name, b, off, len, protectionDomain, true); } // Private method w/ an extra argument for skipping class verification private final Class<?> defineClassCond(String name, byte[] b, int off, int len, ProtectionDomain protectionDomain, boolean verify) throws ClassFormatError {protectionDomain = preDefineClass(name, protectionDomain);Class c = null; String source = defineClassSourceLocation(protectionDomain);try { c = defineClass1(name, b, off, len, protectionDomain, source, verify);} catch (ClassFormatError cfe) { c = defineTransformedClass(name, b, off, len, protectionDomain, cfe, source, verify);}postDefineClass(c, protectionDomain);return c; } protected final Class<?> defineClass(String name, java.nio.ByteBuffer b, ProtectionDomain protectionDomain)throws ClassFormatError { return defineClassCond(name, b, protectionDomain, true); } // Private method w/ an extra argument for skipping class verification private final Class<?> defineClassCond(String name, java.nio.ByteBuffer b, ProtectionDomain protectionDomain, boolean verify) throws ClassFormatError {int len = b.remaining();// Use byte[] if not a direct ByteBufer:if (!b.isDirect()) { if (b.hasArray()) {return defineClassCond(name, b.array(), b.position() + b.arrayOffset(), len, protectionDomain, verify); } else {// no array, or read-only arraybyte[] tb = new byte[len];b.get(tb); // get bytes out of byte buffer.return defineClassCond(name, tb, 0, len, protectionDomain, verify); }} protectionDomain = preDefineClass(name, protectionDomain);Class c = null;String source = defineClassSourceLocation(protectionDomain);try { c = defineClass2(name, b, b.position(), len, protectionDomain, source, verify);} catch (ClassFormatError cfe) { byte[] tb = new byte[len]; b.get(tb); // get bytes out of byte buffer. c = defineTransformedClass(name, tb, 0, len, protectionDomain, cfe, source, verify);}postDefineClass(c, protectionDomain);return c; } // Need to keep this one release after fixing 4735126 - see 4931983 private Class defineClass0(String name, byte[] b, int off, int len, ProtectionDomain pd) { return defineClass0(name, b, off, len, pd, true); } private native Class defineClass0(String name, byte[] b, int off, int len, ProtectionDomain pd, boolean verify); private native Class defineClass1(String name, byte[] b, int off, int len, ProtectionDomain pd, String source, boolean verify); private native Class defineClass2(String name, java.nio.ByteBuffer b, int off, int len, ProtectionDomain pd, String source, boolean verify); // true if the name is null or has the potential to be a valid binary name private boolean checkName(String name) {if ((name == null) || (name.length() == 0)) return true;if ((name.indexOf('/') != -1) || (!VM.allowArraySyntax() && (name.charAt(0) == '['))) return false; return true; } private synchronized void checkCerts(String name, CodeSource cs) {int i = name.lastIndexOf('.');String pname = (i == -1) ? "" : name.substring(0, i);java.security.cert.Certificate[] pcerts = (java.security.cert.Certificate[]) package2certs.get(pname); if (pcerts == null) { // first class in this package gets to define which // certificates must be the same for all other classes // in this package if (cs != null) {pcerts = cs.getCertificates(); } if (pcerts == null) {if (nocerts == null) nocerts = new java.security.cert.Certificate[0];pcerts = nocerts; } package2certs.put(pname, pcerts);} else { java.security.cert.Certificate[] certs = null; if (cs != null) {certs = cs.getCertificates(); } if (!compareCerts(pcerts, certs)) {throw new SecurityException("class \""+ name + "\"'s signer information does not match signer information of other classes in the same package"); }} } private boolean compareCerts(java.security.cert.Certificate[] pcerts, java.security.cert.Certificate[] certs) {// certs can be null, indicating no certs.if ((certs == null) || (certs.length == 0)) { return pcerts.length == 0;}// the length must be the same at this pointif (certs.length != pcerts.length) return false;// go through and make sure all the certs in one array// are in the other and vice-versa.boolean match;for (int i = 0; i < certs.length; i++) { match = false; for (int j = 0; j < pcerts.length; j++) {if (certs[i].equals(pcerts[j])) { match = true; break;} } if (!match) return false;}// now do the same for pcertsfor (int i = 0; i < pcerts.length; i++) { match = false; for (int j = 0; j < certs.length; j++) {if (pcerts[i].equals(certs[j])) { match = true; break;} } if (!match) return false;}return true; } protected final void resolveClass(Class<?> c) {resolveClass0(c); } private native void resolveClass0(Class c); protected final Class<?> findSystemClass(String name)throws ClassNotFoundException {ClassLoader system = getSystemClassLoader();if (system == null) { if (!checkName(name))throw new ClassNotFoundException(name); Class cls = findBootstrapClass(name); if (cls == null) { throw new ClassNotFoundException(name); } return cls;}return system.loadClass(name); } private Class findBootstrapClassOrNull(String name) { if (!checkName(name)) return null; return findBootstrapClass(name); } // return null if not found private native Class findBootstrapClass(String name); protected final Class<?> findLoadedClass(String name) {if (!checkName(name)) return null;return findLoadedClass0(name); } private native final Class findLoadedClass0(String name); protected final void setSigners(Class<?> c, Object[] signers) {c.setSigners(signers); } // -- Resource -- public URL getResource(String name) {URL url;if (parent != null) { url = parent.getResource(name);} else { url = getBootstrapResource(name);}if (url == null) { url = findResource(name);}return url; } public Enumeration<URL> getResources(String name) throws IOException {Enumeration[] tmp = new Enumeration[2];if (parent != null) { tmp[0] = parent.getResources(name);} else { tmp[0] = getBootstrapResources(name);}tmp[1] = findResources(name);return new CompoundEnumeration(tmp); } protected URL findResource(String name) {return null; } protected Enumeration<URL> findResources(String name) throws IOException {return new CompoundEnumeration(new Enumeration[0]); } public static URL getSystemResource(String name) {ClassLoader system = getSystemClassLoader();if (system == null) { return getBootstrapResource(name);}return system.getResource(name); } public static Enumeration<URL> getSystemResources(String name)throws IOException {ClassLoader system = getSystemClassLoader();if (system == null) { return getBootstrapResources(name);}return system.getResources(name); } private static URL getBootstrapResource(String name) { try { // If this is a known JRE resource, ensure that its bundle is // downloaded. If it isn't known, we just ignore the download // failure and check to see if we can find the resource anyway // (which is possible if the boot class path has been modified). sun.jkernel.DownloadManager.getBootClassPathEntryForResource(name); } catch (NoClassDefFoundError e) { // This happens while Java itself is being compiled; DownloadManager // isn't accessible when this code is first invoked. It isn't an // issue, as if we can't find DownloadManager, we can safely assume // that additional code is not available for download. }URLClassPath ucp = getBootstrapClassPath();Resource res = ucp.getResource(name);return res != null ? res.getURL() : null; } /** * Find resources from the VM's built-in classloader. */ private static Enumeration getBootstrapResources(String name)throws IOException {final Enumeration e = getBootstrapClassPath().getResources(name);return new Enumeration () { public Object nextElement() {return ((Resource)e.nextElement()).getURL(); } public boolean hasMoreElements() {return e.hasMoreElements(); }}; } // Returns the URLClassPath that is used for finding system resources. static URLClassPath getBootstrapClassPath() { return sun.misc.Launcher.getBootstrapClassPath(); } public InputStream getResourceAsStream(String name) {URL url = getResource(name);try { return url != null ? url.openStream() : null;} catch (IOException e) { return null;} } public static InputStream getSystemResourceAsStream(String name) { URL url = getSystemResource(name); try { return url != null ? url.openStream() : null; } catch (IOException e) { return null; } } public final ClassLoader getParent() {if (parent == null) return null;SecurityManager sm = System.getSecurityManager();if (sm != null) { ClassLoader ccl = getCallerClassLoader(); if (ccl != null && !isAncestor(ccl)) {sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); }}return parent; } public static ClassLoader getSystemClassLoader() {initSystemClassLoader();if (scl == null) { return null;}SecurityManager sm = System.getSecurityManager();if (sm != null) { ClassLoader ccl = getCallerClassLoader(); if (ccl != null && ccl != scl && !scl.isAncestor(ccl)) {sm.checkPermission(SecurityConstants.GET_CLASSLOADER_PERMISSION); }}return scl; } private static synchronized void initSystemClassLoader() {if (!sclSet) { if (scl != null)throw new IllegalStateException("recursive invocation"); sun.misc.Launcher l = sun.misc.Launcher.getLauncher(); if (l != null) {Throwable oops = null;scl = l.getClassLoader(); try { PrivilegedExceptionAction a; a = new SystemClassLoaderAction(scl); scl = (ClassLoader) AccessController.doPrivileged(a); } catch (PrivilegedActionException pae) { oops = pae.getCause(); if (oops instanceof InvocationTargetException) { oops = oops.getCause(); } }if (oops != null) { if (oops instanceof Error) {throw (Error) oops; } else { // wrap the exception throw new Error(oops); }} } sclSet = true;} } // Returns true if the specified class loader can be found in this class // loader's delegation chain. boolean isAncestor(ClassLoader cl) {ClassLoader acl = this;do { acl = acl.parent; if (cl == acl) {return true; }} while (acl != null);return false; } // Returns the invoker's class loader, or null if none. // NOTE: This must always be invoked when there is exactly one intervening // frame from the core libraries on the stack between this method's // invocation and the desired invoker. static ClassLoader getCallerClassLoader() { // NOTE use of more generic Reflection.getCallerClass() Class caller = Reflection.getCallerClass(3); // This can be null if the VM is requesting it if (caller == null) { return null; } // Circumvent security check since this is package-private return caller.getClassLoader0(); } // The class loader for the system private static ClassLoader scl; // Set to true once the system class loader has been set private static boolean sclSet; protected Package definePackage(String name, String specTitle, String specVersion, String specVendor, String implTitle, String implVersion, String implVendor, URL sealBase)throws IllegalArgumentException {synchronized (packages) { Package pkg = getPackage(name); if (pkg != null) {throw new IllegalArgumentException(name); } pkg = new Package(name, specTitle, specVersion, specVendor, implTitle, implVersion, implVendor, sealBase, this); packages.put(name, pkg); return pkg;} } protected Package getPackage(String name) { Package pkg; synchronized(packages) { pkg = packages.get(name); }if (pkg == null) { if (parent != null) {pkg = parent.getPackage(name); } else { pkg = Package.getSystemPackage(name); } if (pkg != null) { synchronized(packages) { if (packages.get(name) != null) { packages.put(name, pkg); } } }}return pkg; } protected Package[] getPackages() {Map map;synchronized (packages) { map = (Map)packages.clone();}Package[] pkgs;if (parent != null) { pkgs = parent.getPackages();} else { pkgs = Package.getSystemPackages();}if (pkgs != null) { for (int i = 0; i < pkgs.length; i++) { String pkgName = pkgs[i].getName(); if (map.get(pkgName) == null) { map.put(pkgName, pkgs[i]); } }}return (Package[])map.values().toArray(new Package[map.size()]); } protected String findLibrary(String libname) { return null; } static class NativeLibrary {// opaque handle to native library, used in native code. long handle; // the version of JNI environment the native library requires. private int jniVersion; // the class from which the library is loaded, also indicates// the loader this native library belongs. private Class fromClass; // the canonicalized name of the native library. String name; native void load(String name); native long find(String name); native void unload(); public NativeLibrary(Class fromClass, String name) { this.name = name; this.fromClass = fromClass;} protected void finalize() { synchronized (loadedLibraryNames) { if (fromClass.getClassLoader() != null && handle != 0) { /* remove the native library name */ int size = loadedLibraryNames.size(); for (int i = 0; i < size; i++) { if (name.equals(loadedLibraryNames.elementAt(i))) { loadedLibraryNames.removeElementAt(i); break;} } /* unload the library. */ ClassLoader.nativeLibraryContext.push(this); try {unload(); } finally { ClassLoader.nativeLibraryContext.pop(); }} }} // Invoked in the VM to determine the context class in// JNI_Load/JNI_Unload static Class getFromClass() { return ((NativeLibrary) (ClassLoader.nativeLibraryContext.peek())).fromClass;} } // The "default" domain. Set as the default ProtectionDomain on newly // created classes. private ProtectionDomain defaultDomain = null; // Returns (and initializes) the default domain. private synchronized ProtectionDomain getDefaultDomain() {if (defaultDomain == null) { CodeSource cs =new CodeSource(null, (java.security.cert.Certificate[]) null); defaultDomain = new ProtectionDomain(cs, null, this, null);}return defaultDomain; } // All native library names we've loaded. private static Vector loadedLibraryNames = new Vector(); // Native libraries belonging to system classes. private static Vector systemNativeLibraries = new Vector(); // Native libraries associated with the class loader. private Vector nativeLibraries = new Vector(); // native libraries being loaded/unloaded. private static Stack nativeLibraryContext = new Stack(); // The paths searched for libraries static private String usr_paths[]; static private String sys_paths[]; private static String[] initializePath(String propname) { String ldpath = System.getProperty(propname, "");String ps = File.pathSeparator;int ldlen = ldpath.length();int i, j, n;// Count the separators in the pathi = ldpath.indexOf(ps);n = 0;while (i >= 0) { n++; i = ldpath.indexOf(ps, i + 1);}// allocate the array of paths - n :'s = n + 1 path elementsString[] paths = new String[n + 1];// Fill the array with paths from the ldpathn = i = 0;j = ldpath.indexOf(ps);while (j >= 0) { if (j - i > 0) { paths[n++] = ldpath.substring(i, j); } else if (j - i == 0) { paths[n++] = "."; } i = j + 1; j = ldpath.indexOf(ps, i);}paths[n] = ldpath.substring(i, ldlen);return paths; } // Invoked in the java.lang.Runtime class to implement load and loadLibrary. static void loadLibrary(Class fromClass, String name, boolean isAbsolute) { try { if (!DownloadManager.isJREComplete() && !DownloadManager.isCurrentThreadDownloading()) { DownloadManager.downloadFile("bin/" + System.mapLibraryName(name)); // it doesn't matter if the downloadFile call returns false -- // it probably just means that this is a user library, as // opposed to a JRE library } } catch (IOException e) { throw new UnsatisfiedLinkError("Error downloading library " + name + ": " + e); } catch (NoClassDefFoundError e) { // This happens while Java itself is being compiled; DownloadManager // isn't accessible when this code is first invoked. It isn't an // issue, as if we can't find DownloadManager, we can safely assume // that additional code is not available for download. } ClassLoader loader = (fromClass == null) ? null : fromClass.getClassLoader(); if (sys_paths == null) { usr_paths = initializePath("java.library.path"); sys_paths = initializePath("sun.boot.library.path"); } if (isAbsolute) { if (loadLibrary0(fromClass, new File(name))) { return; } throw new UnsatisfiedLinkError("Can't load library: " + name);}if (loader != null) { String libfilename = loader.findLibrary(name); if (libfilename != null) { File libfile = new File(libfilename); if (!libfile.isAbsolute()) { throw new UnsatisfiedLinkError( "ClassLoader.findLibrary failed to return an absolute path: " + libfilename);}if (loadLibrary0(fromClass, libfile)) { return;}throw new UnsatisfiedLinkError("Can't load " + libfilename); }}for (int i = 0 ; i < sys_paths.length ; i++) { File libfile = new File(sys_paths[i], System.mapLibraryName(name)); if (loadLibrary0(fromClass, libfile)) { return; }}if (loader != null) { for (int i = 0 ; i < usr_paths.length ; i++) { File libfile = new File(usr_paths[i],System.mapLibraryName(name));if (loadLibrary0(fromClass, libfile)) { return;} }}// Oops, it failed throw new UnsatisfiedLinkError("no " + name + " in java.library.path"); } private static boolean loadLibrary0(Class fromClass, final File file) {Boolean exists = (Boolean) AccessController.doPrivileged(new PrivilegedAction() {public Object run() { return new Boolean(file.exists());} });if (!exists.booleanValue()) { return false;} String name;try { name = file.getCanonicalPath();} catch (IOException e) { return false;} ClassLoader loader = (fromClass == null) ? null : fromClass.getClassLoader(); Vector libs = loader != null ? loader.nativeLibraries : systemNativeLibraries;synchronized (libs) { int size = libs.size(); for (int i = 0; i < size; i++) { NativeLibrary lib = (NativeLibrary)libs.elementAt(i);if (name.equals(lib.name)) { return true;} } synchronized (loadedLibraryNames) { if (loadedLibraryNames.contains(name)) { throw new UnsatisfiedLinkError ("Native Library " + name + " already loaded in another classloader");}int n = nativeLibraryContext.size();for (int i = 0; i < n; i++) { NativeLibrary lib = (NativeLibrary) nativeLibraryContext.elementAt(i); if (name.equals(lib.name)) { if (loader == lib.fromClass.getClassLoader()) { return true;} else { throw new UnsatisfiedLinkError ("Native Library " + name + " is being loaded in another classloader");} }}NativeLibrary lib = new NativeLibrary(fromClass, name);nativeLibraryContext.push(lib);try { lib.load(name);} finally { nativeLibraryContext.pop();}if (lib.handle != 0) { loadedLibraryNames.addElement(name); libs.addElement(lib); return true;}return false; }} } // Invoked in the VM class linking code. static long findNative(ClassLoader loader, String name) { Vector libs = loader != null ? loader.nativeLibraries : systemNativeLibraries;synchronized (libs) { int size = libs.size(); for (int i = 0; i < size; i++) { NativeLibrary lib = (NativeLibrary)libs.elementAt(i);long entry = lib.find(name);if (entry != 0) return entry; }}return 0; } // -- Assertion management -- // The default toggle for assertion checking. private boolean defaultAssertionStatus = false; // Maps String packageName to Boolean package default assertion status Note // that the default package is placed under a null map key. If this field // is null then we are delegating assertion status queries to the VM, i.e., // none of this ClassLoader's assertion status modification methods have // been invoked. private Map packageAssertionStatus = null; // Maps String fullyQualifiedClassName to Boolean assertionStatus If this // field is null then we are delegating assertion status queries to the VM, // i.e., none of this ClassLoader's assertion status modification methods // have been invoked. Map classAssertionStatus = null; public synchronized void setDefaultAssertionStatus(boolean enabled) { if (classAssertionStatus == null) initializeJavaAssertionMaps(); defaultAssertionStatus = enabled; } public synchronized void setPackageAssertionStatus(String packageName, boolean enabled) { if (packageAssertionStatus == null) initializeJavaAssertionMaps(); packageAssertionStatus.put(packageName, Boolean.valueOf(enabled)); } public synchronized void setClassAssertionStatus(String className, boolean enabled) { if (classAssertionStatus == null) initializeJavaAssertionMaps(); classAssertionStatus.put(className, Boolean.valueOf(enabled)); } public synchronized void clearAssertionStatus() { /* * Whether or not "Java assertion maps" are initialized, set * them to empty maps, effectively ignoring any present settings. */ classAssertionStatus = new HashMap(); packageAssertionStatus = new HashMap(); defaultAssertionStatus = false; } synchronized boolean desiredAssertionStatus(String className) { Boolean result; // assert classAssertionStatus != null; // assert packageAssertionStatus != null; // Check for a class entry result = (Boolean)classAssertionStatus.get(className); if (result != null) return result.booleanValue(); // Check for most specific package entry int dotIndex = className.lastIndexOf("."); if (dotIndex < 0) { // default package result = (Boolean)packageAssertionStatus.get(null); if (result != null) return result.booleanValue(); } while(dotIndex > 0) { className = className.substring(0, dotIndex); result = (Boolean)packageAssertionStatus.get(className); if (result != null) return result.booleanValue(); dotIndex = className.lastIndexOf(".", dotIndex-1); } // Return the classloader default return defaultAssertionStatus; } // Set up the assertions with information provided by the VM. private void initializeJavaAssertionMaps() { // assert Thread.holdsLock(this); classAssertionStatus = new HashMap(); packageAssertionStatus = new HashMap(); AssertionStatusDirectives directives = retrieveDirectives(); for(int i = 0; i < directives.classes.length; i++) classAssertionStatus.put(directives.classes[i], Boolean.valueOf(directives.classEnabled[i])); for(int i = 0; i < directives.packages.length; i++) packageAssertionStatus.put(directives.packages[i], Boolean.valueOf(directives.packageEnabled[i])); defaultAssertionStatus = directives.deflt; } // Retrieves the assertion directives from the VM. private static native AssertionStatusDirectives retrieveDirectives();}class SystemClassLoaderAction implements PrivilegedExceptionAction { private ClassLoader parent; SystemClassLoaderAction(ClassLoader parent) {this.parent = parent; } public Object run() throws Exception {ClassLoader sys;Constructor ctor;Class c;Class cp[] = { ClassLoader.class };Object params[] = { parent }; String cls = System.getProperty("java.system.class.loader");if (cls == null) { return parent;}c = Class.forName(cls, true, parent);ctor = c.getDeclaredConstructor(cp);sys = (ClassLoader) ctor.newInstance(params);Thread.currentThread().setContextClassLoader(sys);return sys; }}
0 0
- Java中ClassLoader类源码
- Java类加载器ClassLoader源码解析
- java源码学习5-ClassLoader
- 【Java】ClassLoader源码全面解析java类加载机制
- Java中ClassLoader笔记
- java中classloader原理
- java中ClassLoader
- [Java类加载器]Java中classLoader浅析.
- java 中ClassLoader的原理
- Java中ClassLoader原理简介
- 类 java.lang.ClassLoader
- Java类加载/ClassLoader
- Java 类加载Classloader
- Java类加载ClassLoader
- JAVA ClassLoader加载类
- JDK源码中ClassLoader的浅析
- ClassLoader对Java源码加解密
- java源码解读之ClassLoader(loadClass方法)
- tensorflow 程序挂起的原因,即整个进程不报错又不执行的原因
- 你的数据存放在哪
- 常用算法
- curl设置不当导致php抓取网页失败
- 结构体的三种初始化方式
- Java中ClassLoader类源码
- Android studio 导入项目出现:Failed to crunch file
- Linux 操作文档命令
- Fiddler图标意义
- 局部变量与全局变量的区别
- 文件上传(Struts框架)
- C++ vector用法
- 二维码(QR code)基本结构及生成原理
- checkbox radio select