为什么不能在引用前使用反斜杠

Why doesnt work a backslash in front of a reference

我写了一个简单的junit测试。我想测试是否可以在引用前面写一个 java 转义反斜杠。这个测试失败了,我不知道为什么。

错误消息:org.junit.ComparisonFailure:应为:<[\London]> 但为:<[$branch]>

public class VelocityBackslashTest {
    @Test
    public void testVelocityBackslash() {
        String inString = "\$branch";

        Velocity.init();
        VelocityContext context = new VelocityContext();
        context.put("branch", "London");

        StringWriter writer = new StringWriter();
        Velocity.evaluate(context, writer, "test_1", inString);

        assertEquals("\London", writer.toString());
    }

}

如果我做同样的测试但从文件中读取模板。结果是阳性。

public class VelocityBackslashFileTest {

    @Test
    public void testVelocityBackslash() {

        Properties p = new Properties();
        p.setProperty("resource.loader", "classpath");
        p.setProperty("classpath.resource.loader.class",
                ClasspathResourceLoader.class.getName());
        Velocity.init(p);
        Template template =
                Velocity.getTemplate("velocity/test_template.vm");

        VelocityContext context = new VelocityContext();
        context.put("branch", "London");

        StringWriter writer = new StringWriter();
        template.merge(context, writer);

        assertEquals("\London", writer.toString());
    }
}

test_template.vm:

\\$分支

这是因为 java.lang.String 使用 \ 作为转义字符。

写的时候

String inString = "\$branch";

Java 将字符串文字 \ 解释为转义的反斜杠,因此实际传递给 Velocity 的是单个 \ 后跟 $branch

Velocity 还使用 \ 作为转义字符,因此它将其输入 ($branch) 解释为转义 $ 符号的指令。换句话说,不要将它用作 Velocity 标记,只需打印文字 $。一旦发生这种情况,那么当然不会尝试将 branch 解析为参考,因此它会作为文字输出。

要在已解析的 Velocity 引用前打印 \,Java 字符串需要将 2 \ 个字符传递给 Velocity,这将像这样完成:

String inString = "\\$branch";