1

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

for (CtField ctf : ctclass.getDeclaredFields()) {
    System.out.println(ctf.getName());
}

因此,我正在访问的类的所有变量都显示在屏幕上,并且效果很好。

我想知道的是可以访问这些变量中的任何一个的值吗?

谢谢你的帮助!

4

2 回答 2

1

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

Object instance = ...
...
for (CtField ctf : ctclass.getDeclaredFields()) {
    Field f = instance.getClass().getDeclaredField(ctf.getName());
    f.setAccessible(true);
    Object value = f.get(instance);
}

如果您尝试访问静态字段,那么您不需要实例,您可以f.get(null)在上面的代码中执行。

此外,如果您将它用于某种分析以及 java 检测或类似的东西,并且您没有正在检查的对象的任何实例,一个可行的策略是添加一个作为实例的static字段Collection到每个类(使用 javassist),然后转换所有构造函数(使用insertAfter)以添加this到该字段。然后,您可以在我的示例中使用相同的反射方法从您关心的每个类中获取这个新字段,因此您将获得对所有实例的引用。

于 2013-09-04T16:12:07.157 回答
1

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

String tempClassPath = tempDirPath + serviceName + sbbJarCmpt;

其中 tempClassPath 是服务 .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);

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

于 2013-09-09T23:02:16.103 回答