我们知道,在Windows平台下,随着软件系统的功能越来越强大,程序也越来越复杂。从最开始的一两个人就能开发一个软件,现在看来基本不可能了。发布的程序量也越来越大,尤其是一些专业软件,安装文件也就几个G,发布的程序文件更是数不胜数。在Windows下,一般由一个正在执行的主程序启动,其他功能由一系列动态链接库组成。主程序运行时,使用的动态链接库一般有三个来源:操作系统自带的公共组件、其他软件安装的组件、本程序自带的组件。一个程序在运行的时候,通常会去这些地方搜索并加载这些动态链接库:1)环境变量Path指定的路径,2)正在执行的程序的当前目录。
Java程序一般以几个Jar包的形式发布。Jar包可以简单地类比为dll。当Java程序被执行时,它们还需要通过一个环境变量CLASSPATH来指定在哪里加载Jar文件。当然这种说法是不准确的。事实上,它告诉Java虚拟机的类装入器搜索哪些目录或Jar文件,并装入要使用的类文件。所以,我们通常需要在命令行执行这样的Java程序:

d:>java -classpath。;lib xx . jar;libyy.jar演示
或者
[at Kyle @ VM _ 2 _ 136 _ centos ~]$ Java-class path。:./lib/xx.jar:。/lib/yy.jar演示
【这里需要注意windows和Linux的路径分隔符的区别。在Windows下,路径是分号“;”Split,而在Linux下是用英文冒号“:”]分割的
那么我们有什么办法可以像Windows可执行程序一样,把一些目录下使用的Jar集中起来,直接以java Demo的形式执行,而不需要指定CLASSPATH变量的参数呢?

答案是肯定的。我们可以使用这个类加载器加载Jar到程序中指定的时间。下面的例子帮助我们理解Java类装入器的使用。
示例:
假设我们有一个简单的演示。个人类。
包演示;公共类人{私人int age私有字符串名称;公众人物{ }公众人物{ this.age = agethis.name = name} public int getAge { return this . age;} public void setAge { this . age = age;}公共字符串getName { return this.name} public void set name { this . name = name;} public String toString { return " Person { name:"+this . name+",age:"+this . age+" } ";}}
我们编译演示。Person并将其打包到person.jar中,例如将其放在当前目录下构建jars目录,jars/person.jar

然后我们可以用下面的代码在被调用的主程序中动态加载jars/person.jar:
导入演示。人;导入Java . io . file;导入Java . lang . reflect . method;导入Java . net . URL;导入Java . net . URL class loader;class Demo { public static void main { try {//package path definition URL URLs[]= new URL[]{ new file . tourl };//获取classloader,然后通过反射调用classloader的addURL方法,将新的jar路径添加到URL class loader URL loader = class loader . getsystemclassloader;Class sysclass = URLClassLoader。类;method method = sys class . getdeclaredmethod;method.setAccessible方法. invoke;人p =新人;system . out . println;} catch { exp.printStackTrace} }}
编译演示类,您将使用person.jar
javac -cp。;罐子/人。罐子Demo.java
我们把编译好的Demo.class放在一个目录下,同时在这个目录下创建jars目录,把person.jar放在jars目录下。我们可以直接在Demo.class文件所在的目录下运行java Demo。


