java中有内联函数吗?

java中有内联函数吗?,java,inline-code,Java,Inline Code,java中是否有内联函数的概念,或者它的替代物?如果有,如何使用?我听说,public、static和final方法是内联函数。我们可以创建自己的内联函数吗?您上面所说的是正确的。有时,最终的方法是以内联方式创建的,但在java中没有其他方式显式创建内联函数。在java中,优化通常在JVM级别完成。在运行时,JVM执行一些“复杂”的分析,以确定要内联哪些方法。它在内联方面具有攻击性,热点JVM实际上可以内联非final方法 java编译器几乎从不内联任何方法调用(JVM在运行时完成所有这些)。它

java中是否有内联函数的概念,或者它的替代物?如果有,如何使用?我听说,
public
static
final
方法是内联函数。我们可以创建自己的内联函数吗?

您上面所说的是正确的。有时,最终的方法是以内联方式创建的,但在java中没有其他方式显式创建内联函数。

在java中,优化通常在JVM级别完成。在运行时,JVM执行一些“复杂”的分析,以确定要内联哪些方法。它在内联方面具有攻击性,热点JVM实际上可以内联非final方法

java编译器几乎从不内联任何方法调用(JVM在运行时完成所有这些)。它们执行内联编译时常量(例如,最终静态原语值)。但不是方法

有关更多资源:

  • ,未完全填充,但包含指向有用讨论的链接


  • Java没有提供手动建议方法应该内联的方法。正如@notnoop在评论中所说,内联通常由JVM在执行时完成。

    不,java中没有内联。是的,当放置在公共类中时,可以在代码中的任何位置使用公共静态方法。java编译器可以在静态方法或final方法上运行,但不能保证这一点

    通常,这种代码优化是由编译器结合JVM/JIT/HotSpot对经常使用的代码段进行的。java中还不知道其他优化概念,如参数的寄存器声明

    优化不能通过java中的声明来强制,而是通过编译器和JIT来完成。在许多其他语言中,这些声明通常只是编译器提示(您可以声明比处理器更多的寄存器参数,其余的被忽略)

    声明java方法静态、最终或私有也是编译器的提示。你应该使用它,但不要担保。Java性能是动态的,而不是静态的。由于类加载,对系统的第一次调用总是很慢。下一个调用速度更快,但取决于内存和运行时,最常见的调用会在运行系统中进行优化,因此服务器在运行时可能会更快

    现实生活中的例子:

    public class Control {
        public static final long EXPIRED_ON = 1386082988202l;
        public static final boolean isExpired() {
            return (System.currentTimeMillis() > EXPIRED_ON);
        }
    }
    
    然后在其他类中,如果代码已过期,我可以退出。如果我引用另一个类中的EXPIRED_ON变量,该常量将内联到字节码,这使得很难在代码中找到检查过期日期的所有位置。但是,如果其他类调用isExpired()方法,则会调用实际的方法,这意味着黑客可以用另一个始终返回false的方法替换isExpired方法

    我同意强制编译器将静态final方法内联到引用它的所有类是非常好的。在这种情况下,您甚至不需要包含控件类,因为在运行时不需要它

    根据我的研究,这是不可能做到的。也许一些模糊处理工具可以做到这一点,或者,您可以在编译之前修改构建过程以编辑源代码


    至于证明在编译过程中是否将控制类中的方法内联到另一个类,请尝试在类路径中不使用控制类的情况下运行另一个类。

    好吧,java中有一些方法可以称为“内联”方法,但这取决于jvm。编译后,如果方法的机器代码小于35字节,它将立即传输到内联方法,如果方法的机器代码小于325字节,它可以传输到内联方法,具体取决于jvm。

    因此,似乎没有,但您可以使用guava或等效函数类实现来使用此解决方案,因为该类非常简单,例如:

        assert false : new com.google.common.base.Function<Void,String>(){
            @Override public String apply(Void input) {
                //your complex code go here
                return "weird message";
            }}.apply(null);
    
    assert false:new com.google.common.base.Function(){
    @覆盖公共字符串应用(无效输入){
    //你的复杂代码在这里
    返回“怪异消息”;
    }}.apply(空);
    

    是的,这是一段死代码,只是为了举例说明如何创建一个复杂的代码块(在{})来做一些特定的事情,而不应该为它创建任何方法,也就是内联方法来打扰我们

    Java9有一个“提前”编译器,它在编译时而不是运行时进行多次优化,这可以看作是内联的。

    Final方法不能保证是内联的。在HotSpot上,添加
    Final
    对于方法是否内联没有任何区别。@Thomas-这就是我说的原因“有时最后的方法。。。“@TomHawtin tackline你有权威的消息来源吗?据我所知,最终方法可以内联而不使用类型保护,这意味着修饰符使内联方法比不使用修饰符更有效。我知道Jikes RVM在决定是否内联时考虑了这一点。你确定HotSpot不会做类似的事情吗?大多数java编译器从不内联方法调用。主要是JVM做的,谢谢你的澄清。我不确定到底发生在哪个阶段。我将编辑我的帖子以反映这一点。@ThomasOwens确实如此,但它不是公开的
    jdk.internal.vm.annotation.ForceInline
    ,只是为了澄清,你的意思是,不是,对吗?作为一个小评论,过早优化是万恶之源。如果不充分理解public、static和final的本质,就无法真正理解内联可能产生的影响——这取决于您使用的JVM。请务必首先回答为什么需要内联:几乎可以肯定的是,您可以在其他地方进行更高的ROI优化。另请参见
    final
    make not impact on JIT inlineing+1,但是我们如何测试方法的编译版本是否是内联的呢?@Pacerier但是为什么我们要测试某些东西是否是内联的呢?这些是Oracle VM的默认值,请参阅,这似乎是一个合理的想法。你有心脏病吗