博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态加载远程Jar的实现方式
阅读量:7074 次
发布时间:2019-06-28

本文共 2026 字,大约阅读时间需要 6 分钟。

hot3.png

    通常动态加载Jar文件,是手动调用UrlClassLoader去加载,然后调用loader的loadClass获取到Class的引用,之后调用反射newInstance创建一个对象实例。

    这种方式写出来的代码太繁琐,并且newInstance返回的对象需要强制类型转换,并且对于IDE来说都是也是不友好的,不利于代码的批量重构。

    所以这种手动加载加载Jar的方式直接放弃了。

    最终的解决方案是动态设置JVM的classPath,并把classPath指定到远程的Jar包。

    1.我们把UserService封装到一个Jar,然后把Jar放到Http服务器的目录。

package com.sun.bean;public class User {		private String id;		public User(String id) {		this.id = id;	}		public void sayHello() {		System.out.println("Hello everyone, my name is "+id);	}	}
package com.sun.service;import com.sun.bean.User;public final class UserService {	public static User getUserById(String id) {		return new User(id);	}}
    然后编译打包成UserService.jar,并放到本地Web服务器的根目录。

    2.下面我们编写使用案例,留意setClassPath方法

package com.sun.bootstrap;import java.lang.reflect.Method;import java.net.URI;import java.net.URL;import java.net.URLClassLoader;import com.sun.bean.User;import com.sun.service.UserService;public class Bootstrap {	public final static void setClassPath(String path) {		try {			URI uri = new URI(path);			URLClassLoader classLoader = (URLClassLoader) ClassLoader.getSystemClassLoader();			Method add = URLClassLoader.class.getDeclaredMethod("addURL", new Class[] { URL.class });			add.setAccessible(true);			add.invoke(classLoader, uri.toURL());		} catch (Exception exp) {			exp.printStackTrace();		}	}	public static void main(String[] args) {		Bootstrap.setClassPath("http://localhost/UserService.jar");		User jim = UserService.getUserById("JimGreen");		jim.sayHello();	}}

    从Bootstrap.java的代码中可以发现,我们直接使用new UserService,而不是通过ClassLoader.loadClass().newInstance()的方式去创建UserService对象实例。

    3.编译Bootstrap类,这一步是关键,在编译时一定要指定classPath,否则编译不通过

javac -classpath /Users/M/workspace/lua/UserService.jar   com/sun/bootstrap/Bootstrap.java

    最后在com/sun/bootstrap路径下生成了Bootstrap.class文件。

    4.执行Bootstrap类   

java com/sun/bootstrap/Bootstrap
    结果打印:

Hello everyone, my name is JimGreen
    总结上述的方式, 我们可以按照平常的方式写代码(区别于loadClass的方式获取Class,然后newInstance),关键点在于调用了SystemClassLoader.addURL添加类加载路径,这样JVM可以主动帮我们 动态加载远程jar包。

转载于:https://my.oschina.net/netflasher/blog/661169

你可能感兴趣的文章
js获取客户端本地ip
查看>>
JQuery事件之取消默认行为
查看>>
redis 学习笔记(未完)
查看>>
线程组
查看>>
dell c6220安装系统--166
查看>>
python 字典多种方法删除 keys
查看>>
VIM使用系列:位置跳转和块模式
查看>>
数组资源
查看>>
【乡巴佬】在Word中合理排列文本框与文本
查看>>
maven 子项目 deploy 到私服
查看>>
等待实习的offer中的想法
查看>>
在Apache配置https方式访问网站
查看>>
线程开发之多线程之间的通讯实现
查看>>
全面分析 Spring 的编程式事务管理及声明式事务管理
查看>>
Leetcode——最长不重复子串
查看>>
myEclipse 中看jar源代码
查看>>
Linux awk 命令 说明
查看>>
shell之变量和引用
查看>>
两个基本概念 标称型数据和数值型数据
查看>>
MediaPlayer视频播放
查看>>