使用Javassist读取变量的值

使用Javassist读取变量的值,java,javassist,Java,Javassist,我使用Javassist获取类上的字段,使用以下代码: for (CtField ctf : ctclass.getDeclaredFields()) { System.out.println(ctf.getName()); } 因此,我正在访问的类的所有变量都显示在屏幕上,这很好 我想知道的是,是否有可能访问这些变量的值 谢谢你的帮助 获取这些变量值的唯一方法是,如果您有一个要获取其值的对象实例(因为不同的实例可能有不同的值) 如果您试图访问静态字段,则不需要该实例,只需在上面的代码

我使用Javassist获取类上的字段,使用以下代码:

for (CtField ctf : ctclass.getDeclaredFields()) {
    System.out.println(ctf.getName());
}
因此,我正在访问的类的所有变量都显示在屏幕上,这很好

我想知道的是,是否有可能访问这些变量的值


谢谢你的帮助

获取这些变量值的唯一方法是,如果您有一个要获取其值的对象实例(因为不同的实例可能有不同的值)

如果您试图访问静态字段,则不需要该实例,只需在上面的代码中执行
f.get(null)


另外,如果您将它与java工具或类似工具一起用于某种类型的评测,并且您没有正在检查的对象的任何实例,那么可行的策略是向每个类添加一个
静态
字段,该字段是实例的
集合(使用javassist)然后转换所有构造函数(使用
insertAfter
)将
添加到该字段。然后,您可以在我的示例中使用相同的反射方法从您关心的每个类中获取这个新字段,因此您将拥有对所有实例的引用。

最后,没有必要使用Javassist。使用Java Reflect就足够了,这样:

String tempClassPath = tempDirPath + serviceName + sbbJarCmpt;
其中tempClassPath是service.jar文件的路径位置

现在,使用Java Reflect:

URL[] classes = {new File(tempClassPath).toURI().toURL()};
URLClassLoader child = new URLClassLoader (classes, this.getClass().getClassLoader());
Class fieldClass = Class.forName(className, true, child);

这样,我就得到了一个类的实例,我可以继续剩下的过程。

您需要一个类的实例来完成这项工作。你有吗?我正在尝试访问一个运行在Jboss服务器上的服务,从另一个运行在同一服务器上的服务,特别是JAIN SLEE。因此,我无法获取实例,因为我正在从另一个服务访问。我正在尝试从运行在Jboss服务器上的另一个服务访问运行在同一服务器上的服务,特别是JAIN SLEE。因此,我无法获取实例,因为我正在从另一个服务访问。我还应该说,我想要获取值的所有字段都是静态字段。那么你应该能够使用我发布的代码,除了使用
f.get(instance)
你需要执行
f.get(null)
。要首先获取
字段
,您需要引用该类的
对象,并且由于没有实例,因此无法执行
instance.getClass()
。如果您还没有类,可以尝试使用
Class.forName(…)
来获取该类。但是,如果您只是查找常量,则根本不需要
字段
,可以使用
CtField.getConstantValue()
。您好,非常感谢您的帮助!你说得对,我没有实例,所以我不能执行instance.getClass()。当您说我可以使用Class.forName(…)时,即使我要访问的类位于另一个服务中,这也是可能的?我不能只使用CtField.getConstantValue(),因为我要获取其值的字段是静态字符串,但没有最终字段,在这种情况下,该方法将返回null。我不熟悉您正在使用的工具/环境,因此我不确定
Class.forName(…)
是否能满足您的需要。如果该类加载到远程VM上(从您描述的内容来看,听起来是这样的),那么它可能无法工作(它将在您的VM中加载该类,但您希望已加载的类不是新的)。无论哪种方式,您都需要在您正在使用的环境中通过某种方式获得您关心的
对象,以完成您想要的任务。
URL[] classes = {new File(tempClassPath).toURI().toURL()};
URLClassLoader child = new URLClassLoader (classes, this.getClass().getClassLoader());
Class fieldClass = Class.forName(className, true, child);