在启动类的标识符中使用的分隔符是斜杠,而不是句点,即我们用“javabunny/JavaBunny”表示启动类,而不是用“javabunny.JavaBunny”的形式。这是因为,FindClass()是一个虚拟机调用,而虚拟机内部用斜杠作为分隔符。随便说明一下,这个例子把启动类的名字(和其他一些配置选项)直接写进了代码之中(称为“硬编码”),对于提供给最终用户使用的产品,这种做法有其优点;但对于开发环境来说,这些值最好拿出来放在某个配置文件中。 Java程序启动后执行的第一个方法称为启动方法,通常是main()。本例通过JNI调用GetStaticMethodID()获得启动方法的ID。GetStaticMethodID()要求指定方法的名字(“main”)和方法的类型描述符(“([Ljava/lang/String;)V”)。这个类型描述符表示方法的参数是一个字符串的数组,返回值类型是void。有关类型描述符的更详细的说明,请参见JVM相关资料。注意,从这里可以看出,在使用定制启动器时,Java程序的启动方法不必一定是static void的main方法,可以用任何方法作为Java程序中第一个执行的方法,甚至包括实例方法或构造函数。 示例程序中最后一个需要注意的地方是jvm->DestroyJavaVM()调用。从表面看起来,这个语句似乎是程序执行后进行清理工作的方法,可有可无。其实不然,如果Java程序是多线程的,在调用这个方法时程序仍旧在运行。例如,对于一个运行着的Swing程序,如果它的main方法结束,DestroyJavaVM()的执行将被阻塞,直至所有非守护线程都执行完毕,所以这行代码是必不可少的。如果省略这行代码,则当主线程执行完毕,即使其他线程(例如Swing GUI的事件循环)仍旧在运行,整个程序也会立即退出。 三、配置和使用 如前所述,这个启动器以硬编码的方式指定了启动类的名字,但是没有一个路径是硬编码的。这是定制启动器的优点之一,由于所有的路径都是相对的,用户可以把整个Java应用从一个文件夹拖到另一个驱动器(或另一台机器)的文件夹,程序的运行不会出现任何问题。本文的启动器假定JRE总是在应用软件所在目录的一个子目录下,也就是说,JRE应当随同应用软件一起发布。这样做的好处是使得应用软件完全不依赖于用户的环境,确保了JRE与应用程序的兼容姓。即使用户系统中原来已经有JRE,增加一个额外的JRE也只不过稍微占用了一点磁盘空间,但却能有效地保证应用软件的稳定姓。 在某些场合,你可能需要将一些配置参数移出程序,例如放入一个配置文件,特别是在需要频繁改动启动方式的开发阶段。建议移出程序之外的配置选项包括:启动类,类的路径,某些VM参数,例如“-verbose”。 |
正在阅读:打造个性化Java启动器打造个性化Java启动器
2004-04-05 10:08
出处:中国计算机报
责任编辑:sdq
键盘也能翻页,试试“← →”键