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

2023-11-19

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

}

}

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • GSON:如何在保持循环引用的同时防止 StackOverflowError?

    我有一个带有循环引用的结构 出于调试目的 我想转储它 基本上任何格式都可以 但我选择了JSON 由于它可以是任何类 所以我选择了不需要 JAXB 注释的 GSON 但是 GSON 会遇到循环引用并递归直到StackOverflowError
  • 如何设置评分栏的星星颜色?

    如何设置评分栏的星星颜色 我想要黄色星星 最简单的方法 android progressTint color color 光滑有光泽
  • Spring Cloud Gateway + Spring安全资源服务器

    我真的不会把它放在这里 但我真的很困惑 我想实现以下目标 我在跑步 Java 14 Spring Cloud Gateway版本 Hoxton SR3 Spring Boot版本 2 2 5 RELEASE 现在我想将安全性集成到我的网关和
  • 如何在angularjs中读取pdf流

    I got the following PDF stream from a server 如何在 AngularJS 中读取这个流 我尝试使用以下代码在新窗口中将其作为 PDF 文件打开 success function data wind
  • Servlet 包含 Tomcat 中的 HTTP 标头

    我有一个 servlet 它的请求调度程序包含另一个 servlet 包含的 servlet 设置了我想在包括小服务程序 因此 我在 include 方法中传入一个自定义 HTTPResponse 对象 该对象捕获来自 servlet 的所
  • emacs 的最佳 java 工具 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 为什么要分离接口和实现?

    在生产代码中 我经常看到定义如下的类 public interface SomeComponent Some methods public class SomeComponentImpl implements SomeComponent S
  • 动态元素 ID 到 setId(int) - Android

    我看到了语法定义setId int and findViewByID int 但我们如何使用findViewById R id row1 我尝试使用这个 Object1 setId Integer parseInt repeat 它没有显示
  • Android 是否可以获取用户和设备所在国家/地区的货币代码?

    是否可以获取用户和设备所在国家 地区的货币代码 我想将用户当前国家 地区的国家 地区代码设置为默认国家 地区 我们在 Android 中有解决方案吗 由于这段代码可能对您有帮助 public class CurrencyTest publi
  • 在 JSON 转换为 CSV 期间保持 JSON 键的顺序

    我正在使用此处提供的 JSON 库http www json org java index html http www json org java index html为了将 json 字符串转换为 CSV 但我遇到的问题是 转换后键的顺序
  • XmlAdapter 到 JAXB 绑定 Joda 的时间间隔?

    我已经被 Web 服务的 JAXB 绑定问题困扰了几个小时 为了准备一个必须返回 Joda Time 类实例 即时 持续时间 间隔等 的更大的 Web 服务 我从一个只有一个返回 Interval 的方法的 Web 服务开始 package
  • 带有 Spock Stub 的泛型

    我无法为泛型类编译 Spock 存根 构造函数的签名如下 SomeClass SerSup
  • Java中的字符算术

    在玩的过程中 我遇到了一些对我来说似乎很奇怪的事情 以下不是有效的 Java 代码 char x A x x 1 possible loss of precision 因为其中一个操作数是整数 所以另一个操作数被转换为整数 结果无法分配给字
  • cipher.update在java中做什么?

    我正在实施 DES CBC 我很困惑什么cipher init cipher update and cipher dofinal做 我只是使用 init 来设置密钥dofinal得到结果 我不使用更新 那是对的吗 另外使用时结果有什么不同U
  • 需要在 java api 中的 Solr 搜索中搜索文本及其周围的几行

    我正在使用 solr 7 7 2 并且我使用 solrj 在 Solr 中编写了一个 Java 程序 该程序在一个巨大的文本文件中搜索单词 我使用以下代码来显示代表整个文本的搜索结果 SolrQuery params new SolrQue
  • 在 Android 应用程序中编辑/添加 IPTC 元数据

    我看过许多其他类似的问题 但似乎没有一个有准确的答案 我正在开发一个可处理大量图像的 Android 应用程序 我希望通过编辑 IPTC 关键字标签 或其他适当标签 的值来向图像添加信息 我在用元数据提取器 http drewnoakes
  • OutputStream 到 DB2 数据库表的 BLOB 列

    在 DB2 数据库中 我有下表 CREATE TABLE MyTestTable MYPATH VARCHAR 512 NOT NULL MYDATA BLOB CONSTRAINT MYTESTTABLE PK PRIMARY KEY M
  • Spring Data 中 IQueryable 的等效项

    我习惯了 Net 和 LINQtoEntities 尤其是 IQueryable 部分 它允许在获取结果之前通过不同的函数传送请求 Spring数据中是否存在类似的东西 或者任何其他 java ORM 我希望能够做的基本示例 private
  • 扫描图像到可读文本

    我想知道是否有一种方法可以通过编写代码来将带有文本的扫描图像转换为可读文本 那可能吗 OCRTools http www ocrtools com是我用于 net 的 对于Java 我用过Aspire http asprise com pr
  • 从 Web 服务器异步调用应用程序

    我有一个用 Spring 制作的 在 Tomcat 上运行的 Web 应用程序 在同一台机器上有一个普通的 Java 应用程序 我想通过从Web服务器调用Java应用程序来执行它 但我想让应用程序不会使用服务器的资源 它涉及分类器的训练 因

随机推荐

  • 【C语言初学】作业:计算在贷款第一个月、第二个月、第三个月后需要还款金额

    贷款金额 20000 00元 年贷款利率 6 0 每个月还款金额 386 66 第一个月剩余的需还款金额 19713 34元 第二个月剩余的需还款金额 19425 25元 第三个月剩余的需还款金额 19135 71元 提示 每个月剩余的贷款
  • 深入浅出 sideEffects

    前言 最近在给团队对 webpack 中的 sideEffects 字段用途进行微分享 于是乎 我最后就整理成一篇文章 希望帮助更多的人理解 sideEffects 的作用 sideEffects 是什么呢 我用一句话来概括就是 让 web
  • redis 安装配置

    原文链接 https www cpweb top 1266 一 介绍 Redis 是一个开源的 基于内存的数据结构存储系统 它可以用作数据库 缓存和消息中间件 它是一个键值 Key Value 存储数据库 为非关系型数据库 它支持多种类型的
  • 在el-table的功能,并且在单元格里面加入输入框

    在我们的前端拿到后端返回的数据的时候 需要在el table的功能 并且在单元格里面加入输入框 为了让输入框的输入时候不会影响到其他的输入框 可以使用 input来获取输入框内容的值
  • python 多个logger对象使用,输出到多个文件

    就不介绍logger基础配置了 如何创建多个logger对象 输出到多个文件 import logging from datetime import datetime def get logger name logger logging g
  • 解决BookxNotePro在linux下无法启动或GLIBC_2.29‘ not found的问题

    问题描述如题 命令行启动出现如下报错 usr local BookxNotePro BookxNotePro usr local BookxNotePro BookxNotePro lib x86 64 linux gnu libm so
  • JS声明二维数组常见办法

    JS声明二维数组常见办法 目录 文章目录 前言 new Array 和 fill fill 灵活插入 for 笨办法 Array from 前言 目前论坛常见的办法代码质量奇差 因此针对这个问题进行整理 new Array和fill con
  • 使用机器学习算法打造一个简单的“微博指数”

    欢迎大家前往腾讯云技术社区 获取更多腾讯海量技术实践干货哦 作者 林浩威 前言 随着人工智能的大热 越来越多的小伙伴们开始投身到机器学习的大潮中 作为其中的一员 我对此也是极有兴趣的 当然我更感兴趣的 是怎么利用这些有趣的算法 来实现脑海里
  • element样式无法修改

    在使用el form组件时 组件中的字体是黑色的 需要显示白色字体就加了个color fff 结果发现修改并没有什么效果 还是原来的黑色 打开F12发现属于 el form item label选择器下面的 我就在css下面修改了该选择器
  • 端口占用查询

    我们做WEB开发 本地调试时 有时出现 Caused by java net BindException Address already in use bind at sun nio ch Net bind0 Native Method a
  • 机械孔与盲孔

    过孔是什么 过孔 Via 电路板上的孔 连接不同层之间的线路 把电路板从平面结构变成立体结构 单层线路想不交叉太难了 双层或更多层线路 必须通过过孔来连接 通过孔壁上的铜 连通上下层的电路铜线 单层PCB 有些时候无法布线 必须通过过孔换层
  • Chisel手册之Types

    本文是Chisel手册第二篇Types Types 表示硬件设计的Chisel图包含原始节点和类型节点 Chisel类型系统与底层Scala类型系统分开维护 因此类型节点散布在原始节点之间 以允许Chisel检查并响应Chisel类型 Ch
  • 微信小程序 实现底部导航栏tabbar

    参考链接 1 微信小程序底部导航Tabbar https www cnblogs com huangjialin p 6278429 html 2 小程序自定义tabbar实现中间图标突出效果 附带wx hideTabBar不生效的bug解
  • Spring Boot 启动报错解决:No active profile set, falling back to default profiles: default

    在SpringBoot启动时 控制台打印出来的信息有这么一条 No active profile set falling back to default profiles default 如下图 这句话的意思是 没有指定项目的配置文件 使用
  • Skyfire: 一种用于Fuzzing的数据驱动的种子生成工具

    Skyfire Data Driven Seed Generation for Fuzzing 作者 杨鑫 清华大学 论文发表于 IEEE S P 2017 原文作者 Junjie Wang Bihuan Chen Lei Wei and
  • C# 使用SignalR实现消息通知

    背景 Web端需要能实时接收到消息推送 当客户有新消息来时 在客户端的右下角进行弹框提醒 什么是signalR Asp net SignalR是微软为实现实时通信的一个类库 一般情况下 signalR会使用JavaScript的长轮询 lo
  • 【Android -- UI 开发】WebView 的基本使用

    一 简介 WebView 在 Android 平台上是一个特殊的 View 基于 webkit 引擎 展现 web 页面的控件 这个类可以被用来在你的 app 中仅仅显示一张在线的网页 还可以用来开发浏览器 WebView 内部实现是采用渲
  • GitHub pages 如何搭建一个个人博客

    搭建一个 GitHub Pages 个人博客的步骤如下 在 GitHub 上创建一个名为 username github io 的仓库 其中 username 是你的 GitHub 用户名 在仓库里创建一个 index html 文件 用于
  • 刚学JavaWeb如何创建一个简单的Servlet项目(保姆级!!!)

    idea如何创建一个简单的Servlet项目 一 准备步骤 1 创建一个工程 2 添加Web application支持 3 部署Tomcat服务器 4 向服务器中添加项目 5 向项目中导入所需要的JAR包 二 编写一个简单的Servlet
  • java动态加载jar包,并运行其中的类和方法

    flink 相关 https www toutiao com article 6883793897495986691 动态加载jar包 在实际开发中经常会需要用到 尤其涉及平台和业务的关系的时候 业务逻辑部分可以独立出去交给业务方管理 业务