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
相关产品推荐
相关产品推荐

