Javassist:在只有右大括号的行插入源代码;
对于一个项目,我使用Javassist插入一些代码。现在我面临着一个我不知道如何解决的问题 问题是这样的: 我想在第122行插入源代码以测试变量Javassist:在只有右大括号的行插入源代码;,java,javassist,Java,Javassist,对于一个项目,我使用Javassist插入一些代码。现在我面临着一个我不知道如何解决的问题 问题是这样的: 我想在第122行插入源代码以测试变量sr.systemId,但Javassist使用方法insertAt(int lineNumber)(来自类CtBehavior)计算包含下一条语句的下一行。这意味着Javassist在第124行而不是第122行插入我的代码,因为第122行只有一个右括号。但是在第124行,变量sr.systemId不再存在,因此引发异常。我不能使用insertAfter
sr.systemId
,但Javassist使用方法insertAt(int lineNumber)
(来自类CtBehavior)计算包含下一条语句的下一行。这意味着Javassist在第124行而不是第122行插入我的代码,因为第122行只有一个右括号。但是在第124行,变量sr.systemId
不再存在,因此引发异常。我不能使用insertAfter()
(CtBehavior),因为它不在methodbody的末尾
public static IXMLReader fileReader(String filename)
throws FileNotFoundException,
IOException
{
StdXMLReader r = new StdXMLReader(new FileInputStream(filename));
r.setSystemID(filename);
for (int i = 0; i < r.readers.size(); i++) {
StackedReader sr = (StackedReader) r.readers.elementAt(i);
sr.systemId = r.currentReader.systemId; // line 121
-> "code I wish to insert goes here" // "line 122"
} // line 122
// line 123
return r; // line 124
}
公共静态IXMLReader文件读取器(字符串文件名)
抛出FileNotFoundException,
IOException
{
StdXMLReader r=新的StdXMLReader(新文件输入流(文件名));
r、 设置系统ID(文件名);
对于(int i=0;i“我希望插入的代码位于此处”//“第122行”
}//第122行
//第123行
返回r;//第124行
}
如何解决这个问题?按行号插入代码通常是个坏主意,很容易出现中断(甚至可能没有行号)。你能用其他方法识别你的注入点吗?我可能可以用pc获得注入点。你知道在使用insertAt(int lineNumber)方法旁边插入代码的另一种方法吗?在javassist教程和internet上的许多其他示例中,我只发现了这种方法……您到底想用仪器做什么?您是否正在尝试测试该方法是否按预期运行?(例如,单元测试?)我想在每个变量或字段赋值之后插入一个methodcall来测试它们是否为null。我正在处理行号,因为它们在之后的“测试”方法中使用。因此,我现在的目的只是向现有的类文件中添加额外的字节码,而不是进行单元测试?如果是这样,这就像在“ClassName”中检查“systemId”的PUTFIELD并在后面插入指令一样简单。