认知 Java Class Loading

对 Java Class Loading 的认知,从OOP (Object Oriented Programming) 界的一句谚语开始,那就是:Everything is Object。以现实举例,张三是对象(object),李四也是对象(object),对这些个体加以抽象,形成了类(class)的概念。这类和对象的区别在于,前者是抽象的概念,不论是时间,还是空间均不存在这么一个东西;后者是具体的物件,可摸得着、看得见。

在 Java 中使用关键字 class 来定义一个类,经过编译之后,便会生成一个后缀为 .class 的文件。在 Java 程序运行时,JVM 需要载入这些 .class 文件到内存中,已构造成对应的 类(class)。而这载入的过程正是由 java.lang.ClassLoader 的实例来完成,根据 JVM 的策略,不同的类(class)被组织进不同的 jar 文件,进而按照重要级别划分成不同的等级,由不同的 class loader 来负责载入。

[ Read More » ]

Activity 与 Main Looper

Android

上文抛出了一个疑问:UI 线程是在哪里绑定 Looper 呢?欲解此题,仍旧从 Android 源码着手,但是 Android 的代码量是以 GB 为单位来计算的,若是一个一个来看,只见树木不见森林,未必能理出个头绪。

不妨通过 Eclipse 这一工具,设置 breakpoint,进入 debug,看一看执行流程。新建一 Android Project,创建简单的 Activity 类,在 onCreate 方法中设置断点,应用进入 debug,在断点处暂停。

[ Read More » ]

Toast 和 Looper

Android

Toast 和 Looper,一个属于 android.widget,一个属于 android.os,两个貌似联系不怎么紧密的类,却通过下面这个异常联系到了一起:

E/AndroidRuntime( 1819): java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
[ Read More » ]

Static Import 和 Constant Interface Antipattern

某日,一同事向我询问 Java 5 中为何要引入 Static Import,一时答不上来,自责平日里“学而不思”,Java 5 的发布已经是六年前(2004年9月30日)的事情了,到现在也只是“知其然”,而不“知其所以然”,之后遂决定对这一问题做一番探究。

此番探究从 SUN 的官方解释入手,从 Static Import 一文中,可以明白引入的目的在于解决 Constant Interface Antipattern。那么什么是 Constant Interface Antiparttern ? 这要从访问 static member 开始说起,如下面代码所示,在 member 之前需要有其对应的类名。

[ Read More » ]

浅析Android MediaProvider之二

Android

MediaProvider 的实质是 Android 的 Core Applications 之一,和 Market 的 app 一样,并无神秘之处,其重要性就是提供了对 media 的操作,而刨根究底,这一操作正是通过同名类 MediaProvider 来实现的。

查阅该类源码,规模不小,再加以纠缠着内部类,第一眼很容易发懵,耐下性子整理出类图如下。正所谓“一个好汉三个帮”,单打独斗固然可以呈现出盖世英雄之势,但是若能团结众人,融合各方能力则能成就一番霸业。史书上的股市是这样,软件开发也如此,大到一个软件产品需要团队来开发,小到一个细微功能也是需要若干相关类来协同。此间厉害可以由类图一目了然。

[ Read More » ]