Java原语包装类如何支持Groovy中的其他方法?

Java原语包装类如何支持Groovy中的其他方法?,java,groovy,Java,Groovy,我来自Java背景,现在正在学习Groovy。以下代码是有效的Groovy代码 def val=1 println val.getClass() //will print java.lang.Integer def ans=3.intdiv(2) //performs integer division 我想知道Groovy如何将intdiv这样的方法添加到最终的java.lang.Integer类中?还有很多其他类似的方法,比如times、upto、downto、step等等。这些方法被

我来自Java背景,现在正在学习Groovy。以下代码是有效的Groovy代码

def val=1
println val.getClass() //will print java.lang.Integer
def ans=3.intdiv(2)    //performs integer division

我想知道Groovy如何将intdiv这样的方法添加到最终的java.lang.Integer类中?还有很多其他类似的方法,比如times、upto、downto、step等等。这些方法被添加到最终的Java类中。这是怎么可能的?

您提到的那些方法称为默认Groovy方法,其中大多数是在类中实现的。像intdiv这样的方法不会添加到最终的Integer类中,而是为默认Groovy方法中的任意数字类实现。现在,当Groovy编译器将Groovy代码编译成字节码时,它检测到类似2.intdiv3的内容,并用类似DefaultGroovyMethods.intdiv2,3的内容替换该表达式

为了更清楚地说明这一点,请查看以下Groovy类:

导入groovy.transform.CompileStatic @编译的 上课{ 静态环[]args{ def val=1 println val.getClass def ans=3.intdiv2 普林顿酒店 } } 当您将其编译为SomeClass.class文件,然后将其反编译为Java时,例如,通过在IntelliJ IDEA中打开此类文件,您将看到以下Java类等效物:

// //IntelliJ IDEA从.class文件重新创建的源代码 //由Fernflower反编译器提供动力 // 导入groovy.lang.GroovyObject; 导入groovy.lang.MetaClass; 导入groovy.transform.Generated; 导入groovy.transform.Internal; 导入org.codehaus.groovy.runtime.DefaultGroovyMethods; 导入org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; 公共类SomeClass实现GroovyObject{ @产生 公共课{ 元类var1=这个。$getStaticMetaClass; this.metaClass=var1; } 公共静态无效字符串…args{ int-val=2; int some=DefaultTypeTransformation.intUnboxDefaultGroovyMethods.IntDivineTeger.valueOfval,3; DefaultGroovyMethods.printlnSomeClass.class,一些; 对象var10000=null; } @产生 @内部的 公共元类getMetaClass{ 元类var10000=this.MetaClass; 如果var10000!=null{ 返回var10000; }否则{ this.metaClass=this.$getStaticMetaClass; 返回这个.metaClass; } } @产生 @内部的 公共无效setMetaClassMetaClass var1{ this.metaClass=var1; } } 你可以看到

def ans = 3.intdiv(2)
变成

int some = DefaultTypeTransformation.intUnbox(DefaultGroovyMethods.intdiv(Integer.valueOf(val), 3));

没有什么神奇之处,只有Groovy编译器知道如何在抽象语法树上进行这种转换。

您提到的那些方法称为默认Groovy方法,其中大多数都是在类中实现的。像intdiv这样的方法不会添加到最终的Integer类中,而是为默认Groovy方法中的任意数字类实现。现在,当Groovy编译器将Groovy代码编译成字节码时,它检测到类似2.intdiv3的内容,并用类似DefaultGroovyMethods.intdiv2,3的内容替换该表达式

为了更清楚地说明这一点,请查看以下Groovy类:

导入groovy.transform.CompileStatic @编译的 上课{ 静态环[]args{ def val=1 println val.getClass def ans=3.intdiv2 普林顿酒店 } } 当您将其编译为SomeClass.class文件,然后将其反编译为Java时,例如,通过在IntelliJ IDEA中打开此类文件,您将看到以下Java类等效物:

// //IntelliJ IDEA从.class文件重新创建的源代码 //由Fernflower反编译器提供动力 // 导入groovy.lang.GroovyObject; 导入groovy.lang.MetaClass; 导入groovy.transform.Generated; 导入groovy.transform.Internal; 导入org.codehaus.groovy.runtime.DefaultGroovyMethods; 导入org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; 公共类SomeClass实现GroovyObject{ @产生 公共课{ 元类var1=这个。$getStaticMetaClass; this.metaClass=var1; } 公共静态无效字符串…args{ int-val=2; int some=DefaultTypeTransformation.intUnboxDefaultGroovyMethods.IntDivineTeger.valueOfval,3; DefaultGroovyMethods.printlnSomeClass.class,一些; 对象var10000=null; } @产生 @内部的 公共元类getMetaClass{ 元类var10000=this.MetaClass; 如果var10000!=null{ 返回var10000; }否则{ this.metaClass=this.$getStaticMetaClass; 返回这个.metaClass; } } @产生 @内部的 公共无效setMetaClassMetaClass var1{ this.metaClass=var1; } } 你可以看到

def ans = 3.intdiv(2)
变成

int some = DefaultTypeTransformation.intUnbox(DefaultGroovyMethods.intdiv(Integer.valueOf(val), 3));
没有魔法,只有魔法 Groovy编译器,知道如何在抽象语法树上进行此类转换