Java 从另一个Jar文件获取字段
我尝试从外部jar读取字段。我们将外部文件命名为:“Data.jar” Data.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
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如果我的答案确实解决了你的问题,请考虑点击它旁边的复选标记。好的,对不起,谢谢。我给这个问题加上了答案。