Tomcat的启动详解

本来,受Oracle面试官的指导。从年前就开始阅读Tomcat的源代码了,在这边就准备把自己的阅读心得拿出来共享下。 作为这个系列的第一篇文章,我们先从如何在Eclipse中运行开始。这一点上, 我是借鉴了I’m Tiger这篇文章。所以在这边,如果希望跳过这一步骤,可以参考他的和我的已经编译好的Tomcat版本。 地址是:I’m Tiger’s Tomcat或者是使用我组织好的Tomcat, Mike’s Tomcat 下载好之后,只需按照一般的Maven项目导入Eclipse就可以了。过程比较简单。 然后可以进入文章的正题了,就是Tomcat的启动过程。 首先,在Eclipse中导入工程之后会看到这样的画面: 这里面,我们可以看到两个目录,一个是tomcat-study,一个是Tomcat7.0,但是我们这边主要是阅读后者的源代码, 上一个项目其实是Tomcat7.0的上级目录,没有什么太大的意义。 然后,我们进入org.apache.catalina.startup.BootStrap类,因为这边有我们亲爱的Main函数。 在这边,我们看到的代码是Tomcat的配置代码,简单的说,就是在Tomcat启动之前去加载那些必须的类库。 在这边加一个断点,然后一步一步走下去。进入init()方法。 这边就是BootStrap函数的init().可以看到,首先就是设置CatalinaHome,CatalinaBase,这两个函数主要的 作用,就是将Catalina的路径找到,方便之后的ClassLoader进行加载。 然后进入的就是initClassLoaders(),这边不得不提一下,Java中的双亲委托模型。…

Android上编译Native C代码

首先,我们不得不提到一个我们在Java程序开发中常使用的JNI模式, 这个模式后来也被Google采用,也能在Android下使用了,但是使用NDK的方式, 写出一个共享so库,然后使用Java JNI技术进行调用。这个方法在编写一些根本不需要 界面的程序时,就显得无比的蛋疼。 所以这边我们介绍一个简单的办法,即编写一个native的本地C程序,直接运行在Android Device上面。 其实说道这边,熟悉ARM开发的人已经知道怎么办了。Android基于Linux和ARM,所以在底层, 就是和一块普通的ARM板没有什么区别,Android只是Linux上的一个小程序。 通常的编程步骤来进行,编写源文件,用编译器编译,链接器链接,然后运行。 我们这边有两个方法获得Android上的编译工具撚,一个方法是编译Android ROM时自动生成的 还有一个办法是,使用Android NDK开发工具包中带的编译工具。 通过编译ROM获得编译工具的方法具体请看AGCC的文档,或者 可以看这篇文章Hello World C program using…

Jar代码注入

有段时间没有写博客了,主要的原因是期末考试和回老家过年,这段时间基本上没有看相关的内容,不过还是有很多可以用来分享的。 就像前一篇日志提到的一样,Java可以从字节码的方式进行玩耍。通过使用Javassist这个类库,可以很方便的进行字节码的操作。 从这个角度讲,有很多我们之前没有想到的方面也可以进行实施。比如说有这么一个jar包,需要进行引用开发,于是乎,我们可以进行一些简单的恶作剧,可以在某一个方法执行之前或之后加入一些注入代码,同时这个方法还可以进行一些简单的破解工作。 主要使用到的工具有jar打包,Javassist类库。接下来我们来讲一个简单的小例子。这个例子就是展示如何向一个已经打包好的jar注入代码。 首先,我们先就看看这个简单的类代码: 之所以包含main函数,主要是用来感受下代码注入之后的效果。 接下来我们看看运行的效果。 这就是我们在代码中包含main函数的用途。 接下来就是我们的注入代码片段。 第一点,我们将gecko.jar加入classpool的classpath,然后我们将Gecko.class从这个jar中提取出来,我们用getDeclearMethods()得到现在这个类的所有方法,这一招可以用来对付那些混淆过得代码。 第二点,我们再使用insertBefore(),和insertAfter()。将自己的注入代码写入class文件。然后将写入的class写入文件。 现在,我们可以在工程的目录下看到已经写入的class文件。 然后就是使用jar打包命令了。这个命令的使用方法很简单,主要的重点也就这两点。 因为我们的jar已经打包,所以,我们只需要解压这个包,然后把class文件进行替换。之后运行以下命令: jar cvfm gecko2.jar gecko/META-INF/MANIFEST.MF -C gecko…