Derby源码初体验

阅读更多
1,sysinfo.java类:
    从最简单的一个command开始,也就是DERBY_HOME和PATH设置完成后,用来check settings的那个command.
    

    1.1看bin\sysinfo.bat脚本文件:
        1.1.1 @echo off是关闭cmd的显示.
        1.1.2 @REM 是注释吧?看起来是.那光是"rem"又是什么意思呢?
        1.1.3 这里边有个 CALL "%~dp0derby_common.bat" %*
            1.1.3.1 从call来看,这句是调用bin\derby_common.bat脚本,那为什么又怎么来了个"~dp0"呢?这是什么意思?那这里的%又表示什么呢?
            1.1.3.2 从derby_common.bat内容来看,这里也又个rem,那它与@REM有什么区别?"rem     %~dp0 is expanded pathname of the current script under NT"
            1.1.3.3 先set DEFAULT_DERBY_HOME=%~dp0.. 从这个set也能看出"%~dp0"是DERBY的安装目录?
            1.1.3.4 如果系统中没有设置"%DERBY_HOME%"为空的话,就在这设置一下,设置完了DERBY_HOME后,就把DEFAULT_DERBY_HOME清空.
            1.1.3.5 下一步set _USE_CLASSPATH = yes,设置这个是什么意思?
            1.1.3.6 if ""%1""=="""" goto doneStart这里连着四个双引号是什么意思?与连着两个双引号有什么不同?从doneStart到setLocalClassPath,看到这里不错,可以自动地设置Derby所需的jar包路径,不错!
            1.1.3.7 这里的shift是个关键字呢?还是什么?
            1.1.3.8 这里的_USE_CLASSPATH与LOCALCLASSPATH有什么关系?

            1.1.3.9 有一句这样的:
                if "%_JAVACMD%" == "" set _JAVACMD=C:\Program Files\Java\jdk1.6.0_03\bin\java.exe

                又有这样的一句:
                    :noJavaHome
                    if "%_JAVACMD%" == "" set _JAVACMD=java.exe
            1.1.3.10 最后有这样一句:endcommon,这是什么意思?
        1.1.4 这里的"%_USE_CLASSPATH%"是什么呢?是Windows下的当前用户环境变量中的那个CLASSPATH?可能是这样的.
            这里的USE_CLASSPATH为"no"时就调用下面的 runNoClasspath.

            而这runNoClasspath里的?
                "%_JAVACMD%" %DERBY_OPTS% -classpath "%LOCALCLASSPATH%" org.apache.derby.tools.sysinfo %DERBY_ARGS% %DERBY_CMD_LINE_ARGS%

                "%_JAVACMD%"是指java这个命令么?那为什么不直接用java这个命令呢?
                %DERBY_OPTS%又是指什么?
        1.1.5 噢,这里的derby_common.bat正如名字所示,就是给Derby的运行设置环境.这样一设置后,就可能运行runNoClasspath或runWithClasspath,这里java命令的运行也没有像自写的那样直接调用java,而是通过derby_common.bat设置的变量来运行的.

        1.1.6 看到这里,别的已差不多了,就只剩下DERBY_OPTS、DERBY_ARGS和DERBY_CMD_LINE_ARGS三个变量没有着落,这三个变量是什么定义的呢?
    1.2 再看sysinfo.java这个类:
        1.2.1 sysinfo有main方法,这也是sysinfo.bat里运行里所要调用的那个main,而这个main又是调用Main.main(args);
            1.2.1.1 看Main类里的main方法:
                1.2.1.2 这里又调用LocalizedResouce类的getInstance()--> new  LocalizedResource()(关键是调用了这类的init方法)-->init方法里getEnvProperty(ENV_CODESET)-->java.security.AccessController.doPrivileged(this)(这里的doPrivileged方法是干啥的呢?).............
                1.2.1.3 噢,看这里的init是若没参数,就用LocalizedResource里默认的那些属性.
                1.2.1.4 看LocalizedResouce类里的LocalizedOutput(包装OutputStream,继承自PrintWriter,覆盖了父类里的close方法,主要是为了判断若不是System.out才close)和LocalizedInput(包装InputStream,继承自InputStreamReader,也覆盖了父类的close),为什么要另写这两个类呢?主要是防止关闭了System.out和System.in,这两个Stream能关掉么?有这样的限制又有什么作用呢?
                1.2.1.5 看到这里,发现了也就是得到LocalizedOutput的out,这样也或多或少地明白了些,为什么要另写LocalizedOutput与LocalizedInput这两个类了,这是本地化的两个类.
                1.2.1.6 再往下就是parseArgs方法了,也就是解析并处理传来的参数.
                    1.2.1.7 看这里parseArgs方法,明白了很多呀.这里并没有实际地调用哪一个方法,而是通过对args的判断修改了这个Main类的一些属性.
                1.2.1.7 -cp时,这样也就是Main里的cptester为true时,调用getClasspathInfo.
                1.2.1.8 -pause,
                1.2.1.9 看Main类,真是太佩服了!一个main方法写的这么灵活!!!这才是一个sysinfo,还没有真正地运行呢,已让我受益废气非浅了,研究高手代码,值!!!

你可能感兴趣的:(Derby,脚本,Windows,Security,Apache)