leravel中间件配置文件|java自定义classloader在加载jar包和classes的时候

⑴ java自定义classloader在加载jar包和classes的时候,classloader不能找到classpath下的配置文件

设我们有一个hello.jar文件,里面有一个Util类,我们希望在运行期调将这个jar包放入到我们运行环境并且调用里面的Util.getVersion方法。怎么实现?在java中,我们的类都是通过ClassLoader来加载的,同时ClassLoader具有层级关系,当某个类找不到时,它会去他的父类加载器去寻找,如果依然找不到,就抛出ClassNotFoundException了。为了动态加载hello.jar里面的Util类,我们需要将这个jar包放入到我们的类加载器中去,然后再获取里面的类。如下面的代码。//位于hello.jarpackagecom.flyingzl;publicclassUtil{publicstaticvoidgetVersion(){System.out.println("javaversion:"+System.getProperty("java.version"));}}importjava.io.File;importjava.lang.reflect.Method;importjava.net.URL;importjava.net.URLClassLoader;publicclassMain{publicstaticvoidmain(String[]args){URL[]urls=newURL[]{};MyClassLoaderclassLoader=newMyClassLoader(urls,null);try{classLoader.addJar(newFile("c:/hello.jar").toURI().toURL());Class<?>clazz=classLoader.loadClass("com.flyingzl.Util");Methodmethod=clazz.getDeclaredMethod("getVersion");method.invoke(null);classLoader.close();}catch(Exceptione){e.printStackTrace();}}{publicMyClassLoader(URL[]urls){super(urls);}publicMyClassLoader(URL[]urls,ClassLoaderparent){super(urls,parent);}publicvoidaddJar(URLurl){this.addURL(url);}}}注意:这里仅仅是为了展示如何动态加载jar包,代码写得很粗,生产代码需要有更完善的异常处理。我们只关心如何动态加载jar包即可。动态加载jar包,需要用到java.net.URLClassLoader这个类,它可以指定一个路径将jar包或者classes文件加载到类空间。加载完毕后,直接调用loadClass就可以加载指定的类,然后通过反射生成实例或者调用方法即可。其实,Tomcat等服务器也利用了此思路,比如每一个web应用启动时,它都会自动加载其下的lib文件夹下的jar包。运行程序,我们就可以看到程序正常输出:javaversion:1.7.0_03


赞 (0)