Java Launcher代码分析(JDK src 下Launcher包)

转载 2011年01月24日 11:04:00

Launcher是JRE中用于启动程序入口main()的类。分析这个类有助于理解JRE系统类的加载机制。

该类主要功能是:创建ExtClassLoader和AppClassLoader,还根据配置创建SercurityManager,设置进程上下文类加载器。

(一)Launcher初始化代码

private static Launcher launcher = new Launcher();
public static Launcher getLauncher() {
return launcher;
}

public Launcher() {
// 1. 创建扩展类加载器:ExtClassLoader
ClassLoader extcl;
try {
extcl = ExtClassLoader.getExtClassLoader();
} catch (IOException e) {
throw new InternalError(
“Could not create extension class loader”);
}

// 2. 创建用于启动应用程序的类加载器:AppClassLoader
try {
loader = AppClassLoader.getAppClassLoader(extcl);
} catch (IOException e) {
throw new InternalError(
“Could not create application class loader”);
}

// 3. 设置当前线程的上下文类加载器为前一步创建的AppClassLoader实例
Thread.currentThread().setContextClassLoader(loader);

//4. 根据需求创建安全管理器:SecurityManager实例
String s = System.getProperty(“java.security.manager”);
if (s != null) {
SecurityManager sm = null;
if (“”.equals(s) || “default”.equals(s)) {
sm = new java.lang.SecurityManager();
} else {
try {
sm = (SecurityManager)loader.loadClass(s).newInstance();
} catch (IllegalAccessException e) {
} catch (InstantiationException e) {
} catch (ClassNotFoundException e) {
} catch (ClassCastException e) {
}
}
if (sm != null) {
System.setSecurityManager(sm);
} else {
throw new InternalError(
“Could not create SecurityManager: ” + s);
}
}
}

创建Launcher几乎是用了一个Singleton模式,但令人疑惑的是其构造方法访问修饰符为public,这样就破坏了Singleton模式,可能是需要在必要的时候创建另一个Launcher实例。

(二)ExtClassLoader

关键代码如下:
String s = System.getProperty(“java.ext.dirs”);
File[] dirs = analyze(s);
URLClassLoader(dirs, null, factory);

因此,ExtClassLoader将加载变量“java.ext.dirs”的值指示的路径下的类,默认是jre安装目录/lib/ext,可以通过Djava.ext.dirs=…,来修改,这个指定目录是一些JDK或JRE的可选择功能扩展包。

(三)AppClassLoader

关键代码是:
final String s = System.getProperty(“java.class.path”);
final File[] path = (s == null) ? new File[0] : getClassPath(s);
return (AppClassLoader)
AccessController.doPrivileged(new PrivilegedAction() {
public Object run() {
URL[] urls =
(s == null) ? new URL[0] : pathToURLs(path);
return new AppClassLoader(urls, extcl);
}
});

可见,AppClassLoader取的是环境变量java.class.path中设定的路径作为类加载的搜索路径。
可以通过对该变量的设定来修改默认配置,实际上我们也常常这样做——虽然我们很少修改java.ext.dirs的值。

绝版的JavaLauncher

  • 2008年07月06日 17:33
  • 54KB
  • 下载

classload之java程序入口sun.misc.Launcher源码分析

java程序的入口就是sun.misc.Launcher了,这个类里面又继承了ExtClassLoader和AppClassLoader和bootstrap的url路径 可以看到Launcher类初始...
  • chaofanwei2
  • chaofanwei2
  • 2016年05月06日 22:51
  • 2579

Launcher3源码浅析(5.1)--Launcher.java

Launcher3源码浅析(5.1)–Launcher.java标签: Android5.1  Launcher3目录 前言 初始化 启动App/Widget 前言  第一次写博客,先来点废话唠叨唠叨...
  • yl10258
  • yl10258
  • 2016年04月16日 15:58
  • 1243

环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的jvm信息

环境变量_JAVA_LAUNCHER_DEBUG,它能给你更多的jvm信息
  • boling_cavalry
  • boling_cavalry
  • 2017年04月28日 13:38
  • 898

JavaLauncher

  • 2009年07月15日 11:02
  • 54KB
  • 下载

javalauncher

  • 2008年05月08日 19:19
  • 2.73MB
  • 下载

javalauncher.zip

  • 2011年03月04日 19:42
  • 2.73MB
  • 下载

java-源码解读-java类加载机制

作为一个java程序员,估计没有人不知道java的类加载机制是委托父加载器加载,也知道java有这么几大类加载器,分别是BootStrapClassLoader,ExtClassLoader,AppC...
  • aBOUNTWINTER
  • aBOUNTWINTER
  • 2017年09月21日 10:53
  • 160

Java Launcher代码分析(JDK src 下Launcher包)

Launcher是JRE中用于启动程序入口main()的类。分析这个类有助于理解JRE系统类的加载机制。该类主要功能是:创建ExtClassLoader和AppClassLoader,还根据配置创建S...
  • a379039233
  • a379039233
  • 2011年01月24日 11:04
  • 3975

Launcher

Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launche...
  • Easy_Gemini
  • Easy_Gemini
  • 2012年11月24日 15:52
  • 4681
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Launcher代码分析(JDK src 下Launcher包)
举报原因:
原因补充:

(最多只允许输入30个字)