假设存在包含Util类的hello.jar文件。 我们希望在运行时将此jar包放入运行时环境中,并调用Util.getVersion方法。 怎么实现?
在java中,我们的类都是通过类加载器加载的。 此外,ClassLoader具有分层结构,如果找不到某个类,它就会去他的父类加载器中查找,如果仍然找不到,它就会抛出ClassNotFoundException。
要动态加载hello.jar中的Util类,必须将此jar包放入类加载器中,然后检索中的类。 如下一段代码所示。
位于hello.jar
packagecom.flyingzl; 公共类util { publicstaticvoidgetversion (
system.out.println (Java version : ) system.getproperty (Java.version );
}
}
importjava.io.File; importjava.lang.reflect.Method; importjava.net.URL; importjava.net.URLClassLoader; public class main { publicstaticvoidmain (字符串[ ] args ) }
URL[] urls=newURL[] {};
myclassloaderclassloader=newmyclassloader (URLs,null ); try{
class loader.add jar (new file (c :/hello.jar ).toURI ).toURL );
class clazz=class loader.load class (com.flying ZL.util );
方法方法=clazz.getdeclaredmethod (getversion );
method.invoke (空);
classLoader.close (;
}catch(exceptione ) {
e .打印堆栈跟踪(;
}
} staticclassmyclassloaderextendsurlclassloader { publicmyclassloader (URL [ ] URLS ) super ) URLs;
}publicmyclassloader(URL[]URLS,ClassLoader parent ) super (URLs,parent );
}publicvoidaddjar(URLURL ) this.addURL ) URL;
}
}
}
注:在本例中,代码编写得很粗,生产代码需要更高级别的异常处理,以演示如何动态加载jar包。 只关心如何动态加载jar包。
要动态加载jar包,必须具有名为java.net.URLClassLoader的类,并且可以指定将jar包或classes文件加载到类空间中的路径。 加载完成后,可以通过直接调用loadClass来加载指定的类,然后在反射中生成实例或调用方法。
实际上,Tomcat等服务也使用了这一观点,例如,当每个web APP应用程序启动时,它下面的lib文件夹下的jar包将自动加载。
运行程序后,可以看到程序会正常输出。
Java版本:1.7.0_ 03