Java 从另一个Jar文件获取字段

Java 从另一个Jar文件获取字段,java,reflection,Java,Reflection,我尝试从外部jar读取字段。我们将外部文件命名为:“Data.jar” Data.jar包含一个名为Constants的类,其中包含一些公共、静态、最终字段。例如: public static final String string1 = "Test"; public static final int integer1 = 1; 如何访问外部文件以获取string1和integer1字段的值?可以使用反射吗?我知道外部罐子和结构 编辑: public Object

我尝试从外部jar读取字段。我们将外部文件命名为:“Data.jar”

Data.jar包含一个名为
Constants
的类,其中包含一些公共、静态、最终字段。例如:

public static final String string1 = "Test"; 
public static final int integer1 = 1;
如何访问外部文件以获取string1和integer1字段的值?可以使用反射吗?我知道外部罐子和结构

编辑:

    public Object getValueFromExternalJar(String className, String fieldName) throws MalformedURLException
    {
       Object val = null;
       // calling the external jar
       URLClassLoader cL = new URLClassLoader(new URL[] { jarURL }, null);
//the null is very important, if the jar is structural identical to this project
       try
       {
          // define the class(within the package)
          Class<?> clazz = cL.loadClass(className);
          // defining the field by its name
          Field field = clazz.getField(fieldName);
          field.setAccessible(true);
          // get the Target datatype
          Class<?> targetType = field.getType();
          Object objectValue = targetType.newInstance();
          // read the value
          val = field.get(objectValue);
       }
       catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalAccessException
             | InstantiationException e)
       {
          LOGGER.log(Level.SEVERE, "An error while accessing an external jar appears", e);
       }
       finally
       {
          try
          {
             cL.close();
          }
          catch (Exception e)
          {
          }
       }
       return val;
    }
外部jars结构是我当前项目的旧版本。因此,我使用
URLClassLoader
并调用类
常量
,我将获得当前项目的值,而不是jars项目的值。那么有没有办法只调用外部jars类呢

解决方案:

    public Object getValueFromExternalJar(String className, String fieldName) throws MalformedURLException
    {
       Object val = null;
       // calling the external jar
       URLClassLoader cL = new URLClassLoader(new URL[] { jarURL }, null);
//the null is very important, if the jar is structural identical to this project
       try
       {
          // define the class(within the package)
          Class<?> clazz = cL.loadClass(className);
          // defining the field by its name
          Field field = clazz.getField(fieldName);
          field.setAccessible(true);
          // get the Target datatype
          Class<?> targetType = field.getType();
          Object objectValue = targetType.newInstance();
          // read the value
          val = field.get(objectValue);
       }
       catch (ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalAccessException
             | InstantiationException e)
       {
          LOGGER.log(Level.SEVERE, "An error while accessing an external jar appears", e);
       }
       finally
       {
          try
          {
             cL.close();
          }
          catch (Exception e)
          {
          }
       }
       return val;
    }
public对象getValueFromExternalJar(字符串类名称,字符串字段名称)引发错误的异常
{
对象val=null;
//调用外部jar
URLClassLoader cL=newurlclassloader(newurl[]{jarURL},null);
//如果jar的结构与此项目相同,则null非常重要
尝试
{
//定义类(在包中)
类clazz=cL.loadClass(类名称);
//通过名称定义字段
Field=clazz.getField(fieldName);
字段。setAccessible(true);
//获取目标数据类型
类targetType=field.getType();
objectValue=targetType.newInstance();
//读取值
val=field.get(objectValue);
}
catch(ClassNotFoundException | NoSuchFieldException | SecurityException | IllegalAccessException
|实例化异常(e)
{
LOGGER.log(Level.severy,“访问外部jar时出现错误”,e);
}
最后
{
尝试
{
cL.关闭();
}
捕获(例外e)
{
}
}
返回val;
}

根据您的描述,使用
URLClassLoader
的一些示例代码如下:

URLClassLoader cl=newurlclassloader(新URL[]{new File(“Data.jar”).toURI().toul()});
clazz类=cl.loadClass(“常数”);
string1=(String)clazz.getField(“string1”).get(null);
int integer1=clazz.getField(“integer1”).getInt(null);

我想您必须更改示例以匹配您的结构。

使用
URLClassLoader
加载JAR,加载类并使用反射访问字段。首先将JAR添加到类路径,然后才能访问JAR中的内容。右键单击您的项目,转到Build Path,然后配置Build Path,在那里您可以添加jar并重建项目,您可以开始使用jar中的类。@raj240,即使添加的jar与项目结构相同?项目结构无关紧要,您要使用的资源需要位于类路径@toni上。当我尝试此操作时,会得到一个
ClassNotFoundException
。我想那是因为我没有写“package.Class”。但当我这样做时,我会得到我的项目的值,因为我在运行的项目中有相同的字段。如何处理重复的名称?我可以列出加载的jar中的所有类吗?哦,这样您的项目就有了相同的类,但有不同的常量?使用
null
(或
ClassLoader.getPlatformClassLoader()
for Java 9+)作为URLClassLoader构造函数的附加参数。我简直不敢相信。它工作!!!谢谢你@约翰尼斯Kuhn@Toni如果我的答案确实解决了你的问题,请考虑点击它旁边的复选标记。好的,对不起,谢谢。我给这个问题加上了答案。