黑马程序员技术交流社区

标题: API文档里有没有ExtClassLoader和APPClassLoader? [打印本页]

作者: code_geass    时间: 2013-8-27 17:06
标题: API文档里有没有ExtClassLoader和APPClassLoader?
在哪个包里?来大神

作者: 范龙波    时间: 2013-8-27 17:21
jdk 的api 应该是查不到,如果你想看源码可以在rt.jar这个包里的下面位置找到
sun.misc.Launcher$ExtClassLoader
sun.misc.Launcher$AppClassLoader
这两个加载器都是由java语言编写的  ,所在的jar包随 classpath下的相关字节码一同加载到内存.
刚好今天整理了下 jvm 的几点小结感兴趣可以看一下.
http://bbs.itheima.com/thread-78838-1-1.html

作者: 张歆明    时间: 2013-8-27 19:05
在rt.jar下的sun.misc包的类Launcher中   
AppClassLoader和ExtClassLoader是内部类 所以  类名中含有$ $前面是外部类  后面是内部类

sun.misc.Launcher$AppClassLoader和sun.misc.Launcher.ExtClassLoader

这个包下面的类不是开源的 所以在java安装路径下的src.zip中没有这个包的源码

之前我对这个类做过反编译  代码如下:

AppClassLoader源码 (从Launcher内部摘取)
由于AppClassLoader是静态内部类,依附于Launcher这个外部类,以下是源码。
  1. static class AppClassLoader extends URLClassLoader{
  2.     public static ClassLoader getAppClassLoader(ClassLoader paramClassLoader)
  3.       throws IOException{
  4.       String str = System.getProperty("java.class.path");
  5.       File[] arrayOfFile = str == null ? new File[0] : Launcher.access$200(str);

  6.       return (ClassLoader)AccessController.doPrivileged(new PrivilegedAction(str, arrayOfFile, paramClassLoader)
  7.       {
  8.         public Launcher.AppClassLoader run() {
  9.           URL[] arrayOfURL = this.val$s == null ? new URL[0] : Launcher.access$300(this.val$path);

  10.           return new Launcher.AppClassLoader(arrayOfURL, this.val$extcl);
  11.         }
  12.       });
  13.     }

  14.     AppClassLoader(URL[] paramArrayOfURL, ClassLoader paramClassLoader){
  15.       super(paramClassLoader, Launcher.factory);
  16.     }

  17.     public Class loadClass(String paramString, boolean paramBoolean) throws ClassNotFoundException{
  18.       int i = paramString.lastIndexOf('.');
  19.       if (i != -1) {
  20.         SecurityManager localSecurityManager = System.getSecurityManager();
  21.         if (localSecurityManager != null) {
  22.           localSecurityManager.checkPackageAccess(paramString.substring(0, i));
  23.         }
  24.       }
  25.       return super.loadClass(paramString, paramBoolean);
  26.     }

  27.     protected PermissionCollection getPermissions(CodeSource paramCodeSource){
  28.       PermissionCollection localPermissionCollection = super.getPermissions(paramCodeSource);
  29.       localPermissionCollection.add(new RuntimePermission("exitVM"));
  30.       return localPermissionCollection;
  31.     }

  32.     private void appendToClassPathForInstrumentation(String paramString){
  33.       assert (Thread.holdsLock(this));

  34.       super.addURL(Launcher.getFileURL(new File(paramString)));
  35.     }

  36.     private static AccessControlContext getContext(File[] paramArrayOfFile)throws MalformedURLException{
  37.       PathPermissions localPathPermissions = new PathPermissions(paramArrayOfFile);

  38.       ProtectionDomain localProtectionDomain = new ProtectionDomain(new CodeSource(localPathPermissions.getCodeBase(), (Certificate[])null), localPathPermissions);

  39.       AccessControlContext localAccessControlContext = new AccessControlContext(new ProtectionDomain[] { localProtectionDomain });

  40.       return localAccessControlContext;
  41.     }

  42.     static
  43.     {
  44.       ClassLoader.registerAsParallelCapable();
  45.     }
  46.   }
复制代码
下面是ExtClassLoader的源码
  1.   static class ExtClassLoader extends URLClassLoader
  2.   {
  3.     public static ExtClassLoader getExtClassLoader() throws IOException{
  4.       File[] arrayOfFile = getExtDirs();
  5.       try{
  6.         return (ExtClassLoader)AccessController.doPrivileged(new PrivilegedExceptionAction(arrayOfFile)
  7.         {
  8.           public Launcher.ExtClassLoader run() throws IOException {
  9.             int i = this.val$dirs.length;
  10.             for (int j = 0; j < i; j++) {
  11.               MetaIndex.registerDirectory(this.val$dirs[j]);
  12.             }
  13.             return new Launcher.ExtClassLoader(this.val$dirs);
  14.           } } );
  15.       } catch (PrivilegedActionException localPrivilegedActionException) {
  16.       }
  17.       throw ((IOException)localPrivilegedActionException.getException());
  18.     }

  19.     void addExtURL(URL paramURL)
  20.     {
  21.       super.addURL(paramURL);
  22.     }

  23.     public ExtClassLoader(File[] paramArrayOfFile)
  24.       throws IOException
  25.     {
  26.       super(null, Launcher.factory);
  27.     }

  28.     private static File[] getExtDirs() {
  29.       String str = System.getProperty("java.ext.dirs");
  30.       File[] arrayOfFile;
  31.       if (str != null) {
  32.         StringTokenizer localStringTokenizer = new StringTokenizer(str, File.pathSeparator);

  33.         int i = localStringTokenizer.countTokens();
  34.         arrayOfFile = new File[i];
  35.         for (int j = 0; j < i; j++)
  36.           arrayOfFile[j] = new File(localStringTokenizer.nextToken());
  37.       }
  38.       else {
  39.         arrayOfFile = new File[0];
  40.       }
  41.       return arrayOfFile;
  42.     }

  43.     private static URL[] getExtURLs(File[] paramArrayOfFile) throws IOException {
  44.       Vector localVector = new Vector();
  45.       for (int i = 0; i < paramArrayOfFile.length; i++) {
  46.         String[] arrayOfString = paramArrayOfFile[i].list();
  47.         if (arrayOfString != null) {
  48.           for (int j = 0; j < arrayOfString.length; j++) {
  49.             if (!arrayOfString[j].equals("meta-index")) {
  50.               File localFile = new File(paramArrayOfFile[i], arrayOfString[j]);
  51.               localVector.add(Launcher.getFileURL(localFile));
  52.             }
  53.           }
  54.         }
  55.       }
  56.       URL[] arrayOfURL = new URL[localVector.size()];
  57.       localVector.copyInto(arrayOfURL);
  58.       return arrayOfURL;
  59.     }

  60.     public String findLibrary(String paramString)
  61.     {
  62.       paramString = System.mapLibraryName(paramString);
  63.       URL[] arrayOfURL = super.getURLs();
  64.       Object localObject = null;
  65.       for (int i = 0; i < arrayOfURL.length; i++)
  66.       {
  67.         File localFile1 = new File(arrayOfURL[i].getPath()).getParentFile();
  68.         if ((localFile1 != null) && (!localFile1.equals(localObject)))
  69.         {
  70.           String str = VM.getSavedProperty("os.arch");
  71.           if (str != null) {
  72.             localFile2 = new File(new File(localFile1, str), paramString);
  73.             if (localFile2.exists()) {
  74.               return localFile2.getAbsolutePath();
  75.             }
  76.           }

  77.           File localFile2 = new File(localFile1, paramString);
  78.           if (localFile2.exists()) {
  79.             return localFile2.getAbsolutePath();
  80.           }
  81.         }
  82.         localObject = localFile1;
  83.       }
  84.       return null;
  85.     }

  86.     private static AccessControlContext getContext(File[] paramArrayOfFile)
  87.       throws IOException
  88.     {
  89.       PathPermissions localPathPermissions = new PathPermissions(paramArrayOfFile);

  90.       ProtectionDomain localProtectionDomain = new ProtectionDomain(new CodeSource(localPathPermissions.getCodeBase(), (Certificate[])null), localPathPermissions);

  91.       AccessControlContext localAccessControlContext = new AccessControlContext(new ProtectionDomain[] { localProtectionDomain });

  92.       return localAccessControlContext;
  93.     }

  94.     static
  95.     {
  96.       ClassLoader.registerAsParallelCapable();
  97.     }
  98.   }
复制代码
这两个类所依附的外部类sun.misc.Launcher的部分源码:


Launcher构造源码.jpg (184.6 KB, 下载次数: 18)

Launcher构造源码.jpg

作者: 以防万一    时间: 2013-8-30 00:40
{:soso_e176:}
亲,请问下问题是否解决?
如果已解决请及时将未解决改为已解决
如果未解决请回帖追问
三天未回复的将视为已解决
详情参考:如何更改分类

保持队形,谢谢合作
{:soso_e181:}





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2