您现在的位置是:首页 > 正文

java动态加载jar包,并运行其中的类和方法

2024-02-01 04:53:35阅读 3

flink 相关 https://www.toutiao.com/article/6883793897495986691/

动态加载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;

/**

*

* 两种方式

*

*/

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<?> 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();

}

}

}

网站文章

  • Redis INFO 命令详解

    Redis INFO 命令详解

    没有代码的解释不是解释,没有deadline的任务不是任务,没有流程图或分享的源码阅读不是源码阅读,没有报告的性能测试不是性能测试。 —— 漠冰 曰这篇文章打算作为INFO命令的输出整理汇总,目前还未全部完成…1. 环境代码版本:redis-4.0.6 工具:本地用CLion打开,增加CMakeLists.txt就可以调试了

    2024-02-01 04:53:18
  • win7计算机窗口左边被改了,win7电脑开始菜单变成经典模式?三种方法教你改回来...

    win7计算机窗口左边被改了,win7电脑开始菜单变成经典模式?三种方法教你改回来...

    今天小编一开电脑,觉得怪怪的,怎么感觉电脑桌面不太一样了?仔细一看,原来是系统开始菜单变成经典模式了,很不习惯,那怎么恢复呢?今天小编就以win7系统为例,教大家怎么改回来。方法一1.在桌面空白处单击...

    2024-02-01 04:52:51
  • Thinkphp5.1实现or查询

    1. where和whereor并用(闭包方式) 查询id = 1,并且user1 = ‘a’ or user2 = ‘a’ Model::where([ [&#39;id&#39;, &#39;=&...

    2024-02-01 04:52:45
  • javascript 闭包最简单理解

    javascript 闭包最简单理解 首先说3点与闭包有关系的东西。一、变量的作用域变量的作用域不难理解。1.函数内部可以访问函数外部的变量,而函数外部不能访问函数内部的变量。2.如果在函数内定义变量的时候,不加var,那么是全局变量(当然函数要...

    2024-02-01 04:52:37
  • jsoup 简介、中文文档、中英对照文档 下载

    jsoup 简介、中文文档、中英对照文档 下载

    jsoup 简介、中文文档、中英对照文档 下载;jsoup、org.jsoup、中文文档、中英对照文档、下载、包含jar包、原API文档、源代码、Maven依赖信息文件、翻译后的API文档、jsoup...

    2024-02-01 04:52:09
  • Java html转word,用freemark生成复杂word格式

    Java html转word,用freemark生成复杂word格式

    Java 生成word,可以将html 较好的转为word。

    2024-02-01 04:52:03
  • docker创建容器并且挂载相应目录

    【代码】docker创建容器并且挂载相应目录。

    2024-02-01 04:51:56
  • 视频直播推流攻略(整理的各大平台推流界面) 热门推荐

    视频直播推流攻略(整理的各大平台推流界面) 热门推荐

    如果我要做一场高端大气的直播活动,需要用高清摄像机拍摄画面,需要接入无人机的高空画面,需要在直播中插入多个镜头,甚至需要把电脑桌面共享到直播画面中...... 该如何将这类现场信号采集并整合起来传输到网络呢? 这个问题不仅牵扯了导播设备的功能性,也涉及了信号“推流”的问题,一般我们将这种前端采集阶段封包好的内容传输到服务器的过程叫做“推流”。 简言之,推流就是将视音频信号传...

    2024-02-01 04:51:49
  • logo自动旋转 html,HTML/CSS3 Logo选择器

    CSS语言:CSSSCSS确定@import "https://fonts.googleapis.com/css?family=Product+Sans";@import "https://fonts...

    2024-02-01 04:51:19
  • Zookeeper

    Zookeeper

    Zookeeper从设计模式角度来理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责通知...

    2024-02-01 04:51:14