在java中有内联函数吗?

在java中是否有内联函数的概念,或者被其他的东西replace了吗? 如果有,它是如何使用的? 我听说publicstaticfinal方法是内联函数。 我们可以创build自己的内联函数吗?

在Java中,优化通常在JVM级别完成。 在运行时,JVM执行一些“复杂”的分析来确定内联哪些方法。 内联可以是积极的,而热点JVM实际上可以内联非最终方法。

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

获取更多资源:

  1. 文章:Java HotSpot性能引擎:方法内联示例

  2. Wiki:OpenJDK内联 ,没有完全填充,但包含有用的讨论链接。

Java不提供手动提示方法应该内联的方法。 正如@notnoop在注释中所说,内联通常是在执行时由JVM完成的。

不,java中没有内联函数 。 是的,您可以在公共类中放置代码中的任何地方使用公共静态方法。 java编译器可能会对静态或最终方法进行内联扩展 ,但这不能保证。

通常,这样的代码优化是由编译器结合使用经常使用的代码段的JVM / JIT / HotSpot完成的。 另外其他优化概念,如参数的寄存器声明在java中是未知的。

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

声明java方法static,final或private也是编译器的提示。 你应该使用它,但没有保证。 Java性能是dynamic的,而不是静态的。 由于类加载,首先调用系统总是很慢。 接下来的调用速度更快,但是根据内存和运行时间的不同,最常见的调用在运行系统中进行了优化,所以服务器在运行时可能会变得更快!

你上面说的是正确的。 有时最终的方法是作为内联创build的,但是没有其他方法可以在java中显式创build内联函数。

现实生活的例子:

 public class Control { public static final long EXPIRED_ON = 1386082988202l; public static final boolean isExpired() { return (System.currentTimeMillis() > EXPIRED_ON); } } 

然后在其他类中,如果代码已经过期,我可以退出。 如果我从另一个类中引用EXPIRED_ONvariables,则该常量与字节代码内联,这使得很难find检查到期date的代码中的所有地方。 但是,如果其他类调用isExpired()方法,则会调用实际的方法,这意味着黑客可能会将isExpired方法replace为总是返回false的方法。

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

从我的研究来看,这是不可能的。 也许一些混淆器工具可以做到这一点,或者,你可以在编译之前修改你的编译过程来编辑源代码。

至于certificate在编译过程中,控件类的方法是否内联到另一个类,请尝试在类path中运行没有Control类的其他类。

那么,有些方法可以在java中被称为“inline”方法,但取决于jvm。 编译完成后,如果方法的机器码小于35字节,则立即转入内联方式,如果方法的机器码小于325字节,可以根据jvm转换为内联方式。

所以,似乎没有,但你可以使用这个解决方法使用番石榴或一个等效的function类的实现,因为这个类是非常简单的,例如:

  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); 

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