使用Javassist读取变量的值

时间:2013-09-04 16:04:15

标签: java javassist

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

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

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

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

感谢您的帮助!

2 个答案:

答案 0 :(得分: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添加到该字段。然后你可以在我的例子中使用相同的反射方法从你关心的每个类中获取这个新字段,因此你将引用所有实例。

答案 1 :(得分: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);

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