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的值。

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

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

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

Launcher

Launcher是安卓系统中的桌面启动器,安卓系统的桌面UI统称为Launcher。Launcher是安卓系统中的主要程序组件之一,安卓系统中如果没有Launcher就无法启动安卓桌面,Launche...

java.lang.OutOfMemoryError内存溢出问题解决方法

往MyEclipse  Window/Preferences/MyEclipse……/Servers/Tomcat/ Tomcat 6.x/JDK  Optional Java VM argume...

高性能网络服务器4---TCP连接的关闭

TCP连接的关闭有两个方法close和shutdown,这篇文章将尽量精简的说明它们分别做了些什么。 为方便阅读,我们可以带着以下5个问题来阅读本文: 1、当socket被多进程或者多线程共享时,关闭...

简单分析Launcher--/src/Workspace.Java

http://lostghoul.blog.163.com/blog/static/11172199920112149294214/ 在Workspace.Java类实现,相关方法有:  a...
  • life02
  • life02
  • 2012年04月18日 17:43
  • 1639

Andorid Launcher程序代码分析

Launcher是Android系统的桌面系统,是比较重要也比较复杂的程序,这里对其代码做一个分析,希望起到抛砖引玉的作用。1. Launcher有什么? live folder , widget ,...

android Launcher onLongClick代码分析

在launcher中,长按桌面会触发很多种行为。其分类包括:1、空白桌面;2、桌面内容(文件夹、快捷方式、文件夹等);3、桌面既有控件(左右两个屏幕切换按钮,all app list按钮)等;因此我们...
  • bmj
  • bmj
  • 2013年03月08日 10:45
  • 1286

Launcher 在配置文件中配置桌面快捷方式->代码分析

在res/xml文件夹下面default_workspace创建一个资源文件,格式如下: xml version="1.0" encoding="utf-8"?> xmlns:launche...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Launcher代码分析(JDK src 下Launcher包)
举报原因:
原因补充:

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