Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javassist:在只有右大括号的行插入源代码‏;_Java_Javassist - Fatal编程技术网

Javassist:在只有右大括号的行插入源代码‏;

Javassist:在只有右大括号的行插入源代码‏;,java,javassist,Java,Javassist,对于一个项目,我使用Javassist插入一些代码。现在我面临着一个我不知道如何解决的问题 问题是这样的: 我想在第122行插入源代码以测试变量sr.systemId,但Javassist使用方法insertAt(int lineNumber)(来自类CtBehavior)计算包含下一条语句的下一行。这意味着Javassist在第124行而不是第122行插入我的代码,因为第122行只有一个右括号。但是在第124行,变量sr.systemId不再存在,因此引发异常。我不能使用insertAfter

对于一个项目,我使用Javassist插入一些代码。现在我面临着一个我不知道如何解决的问题

问题是这样的:

我想在第122行插入源代码以测试变量
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并在后面插入指令一样简单。