支持编译时函数评估的java优化器

支持编译时函数评估的java优化器,java,optimization,Java,Optimization,当参数在编译时已知且没有副作用时,是否有支持编译时函数计算(CTFE,又称编译时函数执行)的优化器(免费或商用) 简单的例子: public class Main { public static void main(String[] args) { HtmlDiv div = new HtmlDiv("test"); System.out.println(div); } } class HtmlDiv { public final S

当参数在编译时已知且没有副作用时,是否有支持编译时函数计算(CTFE,又称编译时函数执行)的优化器(免费或商用)

简单的例子:

public class Main {

    public static void main(String[] args) {
        HtmlDiv div = new HtmlDiv("test");
        System.out.println(div);
    }
}

class HtmlDiv {

    public final String text;

    public HtmlDiv(String text) {
        this.text = text;
    }

    public String toString() {
        return "<div>" + text /* in real life, escape would be used */ + "</div>";
    }
}
公共类主{
公共静态void main(字符串[]args){
HtmlDiv div=新HtmlDiv(“测试”);
系统输出打印LN(div);
}
}
类HtmlDiv{
公共最终字符串文本;
公共HtmlDiv(字符串文本){
this.text=文本;
}
公共字符串toString(){
返回“+text/*”在现实生活中,将使用转义符*/+”;
}
}
这可以优化为:

public class Main {

    public static void main(String[] args) {
        System.out.println("<div>test</div>");
    }
}
公共类主{
公共静态void main(字符串[]args){
系统输出打印(“测试”);
}
}
我问这个问题的主要原因是,从示例中可以看出,对我的servlet使用静态类型(可能有更好的语法,比如用于jvm的ceylong语言)会很好,但是一个println()和分别计算每个html元素的文本之间有很大的区别。然而,肯定还有更多的例子是有用的


我试过ProGuard,但没有优化。我搜索了一下,但没有找到任何支持它的优化器。我也尝试过阅读网站上的链接,但没有一个优化器在他们的网站上提到编译时函数评估,只有其他优化,例如消除死代码。

这是如何工作的?如果有人在运行时(类加载时间)更改了你的
HtmlDiv
类,你仍然会使用预先计算的(因此是错误的)值。当你检查代码进行优化时,你是检查java.exe中编译的代码还是只检查javac.exe中编译的字节码?@b但其他人会这样做。当然,任何人都可以重新编译其中一个类,部署它,并期望其他类引用新类。无论哪种方式,它都会违反一半的JLS,所以不,没有一个。@NESPowerGlove我用java反编译器检查optimizer的输出*.jar文件,这是肯定的。@PENDUT很公平,当然我可以看出它在这种情况下是多么有用。我只是不认为有人在Java中做过这件事,我当然没有听说过类似的事情。我所知道的所有代码转换器工具(如ProGuard)都将类1-to-1转换(除非该类完全未使用或被忽略),并且只能内联方法。