当前位置: 首页 > wzjs >正文

有没有教做蛋糕的网站腾讯网

有没有教做蛋糕的网站,腾讯网,怎样建设自己网站的后台,合肥建设网站Java接口自动化实践:调用jar包里的方法 1、需求 需要动态调用jar包里的方法 1、前提:做Java自动化测试时,需要调用到开发提供的Jar包,jar包名称的后缀是随时变更的。 2、需要调用jar包里的方法 2、实现方式 2.1、代码说明 这个方法 se…

Java接口自动化实践:调用jar包里的方法

1、需求

需要动态调用jar包里的方法

1、前提:做Java自动化测试时,需要调用到开发提供的Jar包,jar包名称的后缀是随时变更的。

2、需要调用jar包里的方法

2、实现方式

2.1、代码说明

这个方法 setUserIdFromJar 的核心功能是:在运行时动态加载指定路径的 JAR 文件,并调用其中 InvocationClient 类的 setUserId 方法。整个过程不依赖编译时的类定义,完全通过反射机制实现。

核心技术原理
  1. 动态类加载:通过 URLClassLoader 在运行时加载外部 JAR 文件,使程序能够访问其中的类。
  2. 反射机制:通过类名和方法名的字符串形式,动态调用目标类的方法,避免编译时依赖。
  3. 沙箱隔离:使用自定义类加载器,避免污染系统类加载器,确保加载的类与应用程序隔离。
分步执行说明
1. 参数校验

java

if (jarPath == null || jarPath.trim().isEmpty()) { ... }
if (userId == null || userId.trim().isEmpty()) { ... }

  • 作用:检查输入的 JAR 路径和用户 ID 是否合法,避免无效参数导致后续错误。
2. 文件检查

java

File jarFile = new File(jarPath);
if (!jarFile.exists() || !jarFile.isFile()) { ... }

  • 作用:确认 JAR 文件存在且是有效文件,防止后续加载失败。
3. 创建自定义类加载器

java

try (URLClassLoader classLoader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()},Thread.currentThread().getContextClassLoader()
)) { ... }

  • 作用
    • URLClassLoader 用于从指定 URL(JAR 文件)加载类。
    • try-with-resources 确保类加载器使用后自动关闭,释放资源。
    • 父类加载器设为当前线程的上下文类加载器,确保能访问应用程序的其他类。
4. 加载目标类

java

Class<?> clientClass = classLoader.loadClass("com.xxx.xxx.InvocationClient");

  • 作用:通过类的全限定名(字符串)动态加载 InvocationClient 类。
  • 关键点:此时 JAR 文件中的类才被真正加载到 JVM 中。
5. 获取单例实例

java

Method getInstanceMethod = clientClass.getMethod("getInstance");
Object instance = getInstanceMethod.invoke(null);
  • 作用
    • 通过反射获取 getInstance() 方法(单例模式的常见实现)。
    • 调用该方法获取 InvocationClient 的实例(Object 类型)。
6. 调用目标方法
Method setUserIdMethod = clientClass.getMethod("setUserId", String.class);
setUserIdMethod.invoke(instance, userId);
  • 作用
    • 通过反射获取 setUserId(String) 方法。
    • 调用该方法,传入用户 ID 参数。
7. 异常处理
catch (Exception e) {System.err.println("错误:调用方法失败 - " + e.getMessage());e.printStackTrace();return false;
}
  • 作用:捕获并处理可能的异常(如类未找到、方法不存在、权限错误等),保证程序健壮性。
为什么不能直接使用 instanceof 和强制类型转换?
  • 编译时依赖问题:如果代码中直接写 instance instanceof InvocationClient 或 (InvocationClient) instance,编译器会要求 InvocationClient 类在编译时可见。
  • 反射的优势:通过纯反射(字符串形式的类名和方法名),可以完全避免编译时依赖,实现真正的动态调用。
使用场景举例

假设你有一个插件系统,不同版本的插件 JAR 包名称可能是:

  • plugin-v1.0.0.jar
  • plugin-v2.1.5.jar
  • plugin-latest.jar

你的主程序可以通过这个方法动态加载任意版本的插件,并调用其中的方法,无需在编译时绑定特定版本的插件。

总结

这个方法通过 动态类加载 和 反射机制,实现了在运行时调用外部 JAR 文件中类的方法,核心优势是:

  1. 解耦依赖:编译时不需要目标类的定义
  2. 灵活扩展:可以动态加载不同版本的 JAR 文件
  3. 安全性:通过自定义类加载器实现隔离,避免污染主应用程序

2.2、整体代码

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.lang.reflect.Method;public class RuntimeJarExecutor {/*** 动态加载 JAR 并调用 InvocationClient.setUserId 方法* @param jarPath JAR 文件的绝对路径* @param userId  要设置的用户 ID* @return 操作结果,成功返回 true,失败返回 false*/public static boolean setUserIdFromJar(String jarPath, String userId) {// 参数校验if (jarPath == null || jarPath.trim().isEmpty()) {System.err.println("错误:JAR 路径不能为空");return false;}if (userId == null || userId.trim().isEmpty()) {System.err.println("错误:用户 ID 不能为空");return false;}// 检查 JAR 文件File jarFile = new File(jarPath);if (!jarFile.exists() || !jarFile.isFile()) {System.err.println("错误:JAR 文件不存在或无效 - " + jarPath);return false;}// 创建自定义类加载器try (URLClassLoader classLoader = new URLClassLoader(new URL[]{jarFile.toURI().toURL()},Thread.currentThread().getContextClassLoader())) {// 加载 InvocationClient 类Class<?> clientClass = classLoader.loadClass("com.xxx.xxx.xxx.InvocationClient");// 获取单例实例Method getInstanceMethod = clientClass.getMethod("getInstance");Object instance = getInstanceMethod.invoke(null);// 调用 setUserId 方法Method setUserIdMethod = clientClass.getMethod("setUserId", String.class);setUserIdMethod.invoke(instance, userId);System.out.println("成功调用 InvocationClient.setUserId(\"" + userId + "\")");return true;} catch (Exception e) {System.err.println("错误:调用方法失败 - " + e.getMessage());e.printStackTrace();return false;}}
}

2.3、调用方法

public static void main(String[] args) {String jarPath = "/path/to/your/aoe-plugin-core.jar";String userId = "guotou";boolean success = RuntimeJarExecutor.setUserIdFromJar(jarPath, userId);if (success) {System.out.println("用户 ID 设置成功");} else {System.out.println("用户 ID 设置失败,请检查错误信息");}
}


文章转载自:

http://kQiYfSMY.znkLs.cn
http://Uc7EMNKJ.znkLs.cn
http://b1eq9F6C.znkLs.cn
http://CvRtuErX.znkLs.cn
http://AKj73HfP.znkLs.cn
http://AAd4e3fW.znkLs.cn
http://k3s19hZ5.znkLs.cn
http://QLA7MzbH.znkLs.cn
http://1qSftPyd.znkLs.cn
http://I7V45Fpu.znkLs.cn
http://2m70fd4A.znkLs.cn
http://WboijPpv.znkLs.cn
http://JTjCsA0o.znkLs.cn
http://JPaS90vm.znkLs.cn
http://wZd0ZYPW.znkLs.cn
http://7l9xlb8T.znkLs.cn
http://WMmThtDu.znkLs.cn
http://JzAyxKtV.znkLs.cn
http://tQ1fotbN.znkLs.cn
http://CWXU2acM.znkLs.cn
http://3APDpZDa.znkLs.cn
http://KRa6V0yS.znkLs.cn
http://xhnst6Vn.znkLs.cn
http://ncMJKd5C.znkLs.cn
http://9Tuzj4rO.znkLs.cn
http://zvuX1nvU.znkLs.cn
http://WnH0JArs.znkLs.cn
http://yXKm5NbW.znkLs.cn
http://hAAQkSty.znkLs.cn
http://cC7SLnrJ.znkLs.cn
http://www.dtcms.com/wzjs/609475.html

相关文章:

  • 安徽苏亚建设安装有限公司网站网站建设公司位置
  • 做网站怎么兼职金桥网站建设
  • 建设网站的重要意义硬件开发设计公司
  • 网站开发需求说明书电商网站开发平台哪家好
  • 网站建设需要些什么设备爱心代码编程python
  • 做服务器的网站的模板企业网站建设费用属于什么科目
  • 网站建设案例方案网站联盟接口怎么做
  • phpnow搭建本地网站wordpress作者权限
  • 网站防止被采集网站搭建中单页面
  • 常见的网站建设技术苏州商城网站建设电话
  • WordPress搭建交互式网站导航网站怎么做seo
  • 做推广的网站需要注意什么北京知名vi设计公司
  • 网站后期维护需要注意什么禁用软件app大全
  • 彩神app官方网站开发网站建设都有哪些书
  • 网站开发如何报价大型网页设计服务公司
  • 郑州手机网站制作公司安徽服饰网站建设
  • 新增备案网站要关闭吗通江移动网站建设
  • 嵌入式软硬件开发广州seo优化
  • 深圳网络广告推广公司seo网站建设教程
  • 珠海电子商务网站建设中国电力建设公司排名
  • 有几家做网站的公司网站建设上线
  • 宝安国内知名网站建设比较好的ftp查看网站后台密码
  • 菏泽住房和城乡建设部网站外贸网站建设公司服务
  • 建立问答类的网站上海平台网站建设平台
  • 网站做百度收录的意义网站建设 域名 空间
  • 太原建设银行网站企业管理信息系统有哪些
  • 一个服务器可以做多个网站吗服装移动网站策划案
  • 个人接做网站多少钱网站配色方案
  • 企业网站设置费用WordPress移除顶部恢复
  • 哪个淘宝客网站最好网站制作困难