java中如何从远程主机(服务器)或本地加载jar文件
2016-01-13 10:15
633 查看
我们的java程序其实是由若干个.class文件组成。当程序在运行时,就会调用一个入口函数,即main()函数,来调用系统的相关功能,而这些功能都被封装在不同的class文件中,所以经常要从这个class文件中调用另一个class文件中的方法。如果另外一个文件不存在,则会引发系统异常。而程序在启动的时候,并不会一次性加载程序所要的所有class文件,而是根据需要,通过java的类加载器(ClassLoader)来动态地加载所需的class文件到内存中,class文件只有被载入到了内存中之后,才能被其它class所引用。所以,ClassLoader就是用来动态加载class文件到内存当中的。
1、ClassLoader加载类的过程
java利用ClassLoader将类载入内存,并且在同一应用中,可以有多个ClassLoader,通过委派机制,把装在的任务传递给上级的装载器,依此类推,直到启动类装载器(没有上级的类装载器,处于最顶端)。如果启动类装载器能够装载这个类,那么它首先装载。如果不能,则往下传递。URLClassLoader是ClassLoader的子类,它用于从指向JAR文件和目录的URL搜索路径下加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class文件到内存中。
2、举例说明
(1) 在eclipse中创建一个java项目,例如urlTest0,定义一个接口,如下:
(2)接着再新建一个java项目,urlTest1.引入之前打包好的jar文件,即testInterface.jar,并创建TestAction类,使它实现ActionInterface接口。如下
(3)新建java项目,urlTest2,引入testInterface.jar,并创建一个带有main()函数的类,代码如下:
this ActionTest class
示例2
创建一个java项目test,并创建一个类,TestAction,代码如下:
在另一个需要加载这个test.jar文件的主机上,创建一个java项目,demo,然后再创建一个类UseClassloader,代码如下:
1、ClassLoader加载类的过程
java利用ClassLoader将类载入内存,并且在同一应用中,可以有多个ClassLoader,通过委派机制,把装在的任务传递给上级的装载器,依此类推,直到启动类装载器(没有上级的类装载器,处于最顶端)。如果启动类装载器能够装载这个类,那么它首先装载。如果不能,则往下传递。URLClassLoader是ClassLoader的子类,它用于从指向JAR文件和目录的URL搜索路径下加载类和资源。也就是说,通过URLClassLoader就可以加载指定jar中的class文件到内存中。
2、举例说明
(1) 在eclipse中创建一个java项目,例如urlTest0,定义一个接口,如下:
package com.example; public interface ActionInterface{ public String action(); }然后,右击项目->export->java->JAR file,然后点击next,选择jar文件存放的位置。我存放的位置是D:/testInterface.jar
(2)接着再新建一个java项目,urlTest1.引入之前打包好的jar文件,即testInterface.jar,并创建TestAction类,使它实现ActionInterface接口。如下
package com.example; import com.example.ActionInterface; public class TestAction implements ActionInterface{ public String action(){ return "this ActionTest class"; } }将其打包成test.jar文件,方法同上。放到你想放的位置。比如,放到web服务器上,如tomcat的webapps子目录下。这样是为了通过http方式进行访问。
(3)新建java项目,urlTest2,引入testInterface.jar,并创建一个带有main()函数的类,代码如下:
package com.example; import com.example.ActionInterface; public class ClassLoaderTest{ public static void main(String args[]){ File file=new File("http://10.50.114.12:8080/test.jar");//10.50.114.12是我远程主机的ip地址,如果test.jar是存放在本地web服务器上的话,只需要将10.50.114.12换成localhost即可 URL url=file.toURI().toURL(); @SuppressWarnings("resource") URLClassLoader myClassLoader=new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader()); Class<?> myClass=myClassLoader.loadClass("urlTest1.TestAction"); ActionInterface action1=(ActionInterface)myClass.newInstance(); String str=action1.action(); System.out.println(str); } }运行的结果是:
this ActionTest class
示例2
创建一个java项目test,并创建一个类,TestAction,代码如下:
package com.example.netlab; public abstract class TestAction{ public TestAction(){
System.out.println("Hello,world!");
} }
将该项目导出为test.jar放到web服务器上,位置和上面一样。
在另一个需要加载这个test.jar文件的主机上,创建一个java项目,demo,然后再创建一个类UseClassloader,代码如下:
package com.example.netlab; import java.io.File; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; public class UseClassloader { public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException, MalformedURLException { File file=new File("http://10.50.63.109:8080/test.jar"); URL url=file.toURI().toURL(); @SuppressWarnings("resource") URLClassLoader myClassLoader=new URLClassLoader(new URL[]{url},Thread.currentThread().getContextClassLoader()); Class<?> myClass=myClassLoader.loadClass("com.example.netlab.TestAction"); Object o=myClass.newInstance(); } }
相关文章推荐
- spring JPA中对自定义实体的查询经验
- Spring Security笔记:使用BCrypt算法加密存储登录密码
- eclipsesvn总是提示输入密码?svn总是提示输入密码的解决!
- Spring MVC 通过@Value注解读取.properties配置内容
- eclipse中快捷键
- Java内存溢出详解
- hibernate的配置1
- JAVA线程同步辅助类CountDownLatch
- java 提取目录下所有子目录的文件到指定位置
- 深入浅出RxJava(一:基础篇)
- 国外用spring开发的开源系统值得学习
- eclipse Debug 技巧
- java 线程
- Eclipse中如何添加Junit jar包
- Myeclipse中快捷键大全
- Java使用“==”所遇到的坑
- java中静态代码块的使用场景
- Spring框架的使用
- 把Eclipse自带的浏览器修改为自己习惯的浏览器
- 修改Eclipse格式化代默认长度