You need to enable JavaScript to run this app. Java如何从结构与当前项目一致的外部Jar中读取类指定字段值
优惠活动
大模型
产品
解决方案
定价
更多

Java如何从结构与当前项目一致的外部Jar中读取类指定字段值

从外部Jar读取指定类字段(规避同名类加载冲突)

我尝试从外部Jar文件读取字段,将该外部文件命名为Data.jar。
Data.jar中包含一个名为Constants的类,该类带有多个public、static、final类型的字段,示例如下:

public static final String string1 = "Test"; 
public static final int integer1 = 1;

我已知该外部Jar的结构,请问该如何访问该外部文件以获取string1和integer1字段的值?是否可以使用反射实现?

补充说明:该外部Jar的结构是当前项目的旧版本,因此如果直接使用URLClassLoader调用Constants类时,会获取到当前项目对应类的取值,而非外部Jar中的类。请问是否有办法仅调用外部Jar中的类?

实现方案

将自定义类加载器的父加载器设置为null,打破常规双亲委派的类加载路径,确保指定类仅从目标外部Jar的路径加载,不会命中当前项目类路径下的同名类。参考实现代码如下:

public Object getValueFromExternalJar(String className, String fieldName) throws MalformedURLException
{
   Object val = null;
   // 加载外部Jar
   URLClassLoader cL = new URLClassLoader(new URL[] { jarURL }, null);
   // 此处传入null作为父类加载器非常重要,适用于Jar结构与当前项目一致的场景
   try
   {
      // 加载指定包路径下的类
      Class<?> clazz = cL.loadClass(className);
      // 根据字段名获取对应字段
      Field field = clazz.getField(fieldName);
      field.setAccessible(true);
      // 获取字段的目标数据类型
      Class<?> targetType = field.getType();
      Object objectValue = targetType.newInstance();
      // 读取字段值
      val = field.get(objectValue);
   }
   catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalAccessException
         | InstantiationException e)
   {
      LOGGER.log(Level.SEVERE, "访问外部Jar时出现错误", e);
   }
   finally
   {
      try
      {
         cL.close();
      }
      catch (Exception e)
      {
      }
   }
   return val;
}

内容的提问来源于stack exchange,提问作者Toni

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.03 07:45:03