动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。
下面通过一个实例来直观演示:
第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)
package com.java.loader;
public abstract class AbstractAction {
public abstract String action();
第二:写个实体类继承一下 TestAction
package com.java.jarloader;
import com.java.loader.AbstractAction;
public class TestAction extends AbstractAction{
public String action() {
System.out.println("I am working ! ");
return "this ActionTest class";
第三:将TestAction所在的包导出成jar包的方式,eclipse中直接export即可,放到指定目录,此处放在
D:\jarload\test.jar
放好后,删除TestAction文件和package。
第四:写个main函数测试下 TestMain (这里比较无聊,写了个从文件读的方式获取jar路劲,路径就是上面提到的jar所在的位置)
package com.java.main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.net.URLClassLoader;
import com.java.loader.AbstractAction;
import com.java.loader.AbstractAction;
* 两种方式
public class TestMain {
public static void main(String[] args) {
try {
//第一种 配置成文件格式
File file = new File("D:\\jarload\\test.txt");
BufferedReader in = new BufferedReader(new FileReader(file));
String s = new String();
while ((s = in.readLine()) != null) {
URL url = new URL(s);
s = null;
URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
.getContextClassLoader());
Class<? extends AbstractAction> myClass = (Class<? extends AbstractAction>) myClassLoader.loadClass("com.java.jarloader.TestAction");
AbstractAction action = (AbstractAction) myClass.newInstance();
String str = action.action();
System.out.println(str);
//第二种
URL url1 = new URL("file:D:/jarload/test.jar");
URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
.getContextClassLoader());
Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
AbstractAction action1 = (AbstractAction) myClass1.newInstance();
String str1 = action1.action();
System.out.println(str1);
} catch (Exception e) {
e.printStackTrace();
第五:运行结果:
这是能完成运行的!
下面我们来改写下:
第一:将抽象类改成接口的形式 InterfaceAction
package com.java.loader;
public interface InterfaceAction {
public String action();
第二:改写下实体类,实现接口 TestAction
package com.java.jarloader;
import com.java.loader.InterfaceAction;
public class TestAction implements InterfaceAction{
@Override
public String action() {
System.out.println("I am working ! ");
return "this ActionTest class";
第三步相同。
第四步:稍作修改 TestMain
package com.java.main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.net.URL;
import java.net.URLClassLoader;
import javax.swing.AbstractAction;
import com.java.loader.InterfaceAction;
//第一种 配置成文件格式
File file = new File("D:\\jarload\\test.txt");
BufferedReader in = new BufferedReader(new FileReader(file));
String s = new String();
while ((s = in.readLine()) != null) {
URL url = new URL(s);
s = null;
URLClassLoader myClassLoader = new URLClassLoader(new URL[] { url }, Thread.currentThread()
.getContextClassLoader());
Class<?> myClass = (Class<?>) myClassLoader.loadClass("com.java.jarloader.TestAction");
InterfaceAction action = (InterfaceAction) myClass.newInstance();
String str = action.action();
System.out.println(str);
//第二种
URL url1 = new URL("file:D:/jarload/test.jar");
URLClassLoader myClassLoader1 = new URLClassLoader(new URL[] { url1 }, Thread.currentThread()
.getContextClassLoader());
Class<?> myClass1 = myClassLoader1.loadClass("com.java.jarloader.TestAction");
InterfaceAction action1 = (InterfaceAction) myClass1.newInstance();
String str1 = action1.action();
System.out.println(str1);
} catch (Exception e) {
e.printStackTrace();
第五:运行结果相同。
springboot动态加载jar中的bean,在有些业务场景下,需要SpringBoot来动态加载jar中的class文件,自动往spring容器中添加新的bean;如物联网设备上传的信息用物模型来解析,用java来解析物模型,但用户的设备千差万别,解析设备的物模型不可能包罗万象,设备往物联网平台上传的数据格式也是千差万别,这时就可以让用户自已实现解析物模型的java代码,然后打成jar包,上传到物联网平台,物联网平台就可以解析当前用的设备信息了。
动态加载jar包,在实际开发中经常会需要用到,尤其涉及平台和业务的关系的时候,业务逻辑部分可以独立出去交给业务方管理,业务方只需要提供jar包,就能在平台上运行。
下面通过一个实例来直观演示:
第一:定义一个抽象类 AbstractAction (稍后换成接口的实例)
public static void loadJar(String jarPath) {
File jarFile = new File(jarPath);
// 从URLClassLoader类中获取类所在文件夹的方法,jar也可以认为是一个文件夹
Method method = null;
try {
method = URLClassLoader.class.getDeclaredMethod("addURL", URL.class);
1、动态加载jar包主要是通过URLClassLoader来加载jar包。2、然后通过ClassLoader中的loadClass来获取class。3、备注一些常用的方法。
经常碰到需要动态加载jar及class文件的场景。Java类由于需要加载和编译字节码,动态加载class文件较为麻烦,但JDK仍提供了一整套方法来动态加载jar文件和class文件。一、动态加载jar// 系统类库路径File libPath = new File(jar文件所在路径);// 获取所有的.jar和.zip文件File[] jarFiles = libPath.listFiles(n...
在项目开发的过程中,有时候需要动态灵活的加载某个jar包并执行其里面的方法的时候,我们可以使用本篇文章写的方式去动态的加载jar包而不用使用原始方式引入jar包作为lib去使用,接下来介绍如何动态加载jar包。直接上代码:
核心的方法就是下面这个loadJar方法,我们传入一个jar包的路径即可。
public static void loadJar(String jarPath) {
服务中有众多任务,当其中任一任务有改动需要升级或新增一个任务时,都需要将服务重启,会影响其他任务的正常运行。因此采用java动态加载的方式,将不同任务插件化形式加载到服务中心,配合xxl-job任务调度框架统一管理。实现了插件化任务管理。
本classloader可以从ftp或本地系统中动态的加载jar,zip资源,当资源实时变动时classlader会自动重新加载,不需要应用重新启动。样例:
加载ftp上某个目录下的所有jar,zip资源。
SingleClassLoader loader = new SingleClassLoader("10.11.20.104","weblogic","weblogic","test")
加载本地目录下的所有jar,zip资源
SingleClassLoader loader = new SingleClassLoader("C:\\test\\out\\production\\test");
每个jar由单独的SingelClassLoader加载的
很多同学想进大厂,特别是刚毕业的,以及工作年限短的,不要有任何侥幸心理,踏踏实实的把基础弄扎实了,这是你通往高薪之路的唯一正确姿势。
首先从面试题做起~好了,不多说了,直接上正菜。
Java基础
JDK 和 JRE 有什么区别?
== 和 equals 的区别是什么?
两个对象的 hashCode()相同,则 equals()也一定为 true,对吗?
final 在 java 中有什么作用?
java 中的 Math.round(-1.5) 等于多少?
String 属于基础的数据类型吗?
导读:在实际项目开发中,有时会遇到需动态加载jar包的应用场景。如将Flink的UDF自定义方法制作成方法库(既打成一个Jar),在提交给Flink集群的Job中动态加载jar便可使用。下面将举一个简单实现Java动态加载Jar的例子。环境准备动态加载Jar实现解析与拓展环境准备为了便于实现Demo,这里构建一个模块化Maven项目dynamicloading,项目包含:dyna-loading-...