Groovy @TypeChecked和@CompileStatic之间的差异
有人能解释一下@TypeChecked和@CompileStatic之间的区别吗 我读到@TypeChecked不可能在运行时添加新方法。 还有哪些功能是不允许的 @CompileStatic允许哪些Groovy功能?Groovy @TypeChecked和@CompileStatic之间的差异,groovy,Groovy,有人能解释一下@TypeChecked和@CompileStatic之间的区别吗 我读到@TypeChecked不可能在运行时添加新方法。 还有哪些功能是不允许的 @CompileStatic允许哪些Groovy功能? 与groovyc和@CompileStatic相比,字节码是否与使用javac编译的字节码相同 主要区别在于MOP(元对象协议):@TypeChecked让方法通过MOP,而@CompileStatic生成类似于Java字节码的方法调用。这意味着它们的语义不同,但也意味着您仍然可
与groovyc和@CompileStatic相比,字节码是否与使用javac编译的字节码相同 主要区别在于MOP(元对象协议):
@TypeChecked
让方法通过MOP,而@CompileStatic
生成类似于Java字节码的方法调用。这意味着它们的语义不同,但也意味着您仍然可以在@TypeChecked
代码之上应用元编程,只要方法调用可以在编译时解析
以下代码显示了作用于@TypeChecked
代码而非@CompileStatic
代码的MOP:
import groovy.transform.CompileStatic as CS
import groovy.transform.TypeChecked as TC
class Foo {
def bar = "bar"
}
class TestTC {
Foo foo
TestTC() {
foo = new Foo()
foo.metaClass.getBar = { "metaClass'd bar" }
}
@TC
def typed() {
foo.bar
}
@CS
def compiled() {
foo.bar
}
}
assert new TestTC().typed() == "metaClass'd bar"
assert new TestTC().compiled() == "bar"
对于@CompileStatic
,是的,Groovy尝试生成接近javac
输出的字节码,因此,除了少数例外
(更新日期:2016-01-13)
@CompileStatic
和@TypeChecked
都将允许:
- 关闭(包括通过
进行的关闭授权)李>@DelegatesTo
- ASTs(可用于安装)李>
- Groovy的syntactic sugar,比如正则表达式、列表、映射、操作符重载等等李>
@TypeChecked
,您还可以通过命令编译器忽略某些类型检查,从而提供更大的灵活性@CompileStatic
也支持此功能,但它是一个。tl/dr
- @TypeChecked在编译期间只检查类型,但编译后的代码的行为与未编译时的行为相同
@TypeChecked
- @CompileStatic检查类似于
,但也会在运行时将代码修改为类型安全,这意味着使用动态编程的方法将中断@TypeChecked
@TypeChecked
。它允许拖把的东西。它将使DSL引擎的代码更加冗长(即,您不能返回方法上的映射,必须使用定义良好的方法返回对象),但它会更早地发现问题。请注意,这禁止了一些非常酷的东西,例如。您以前使用过javax.script.*
和@TypeChecked
吗?我不确定该注释是否可以用于?@KevinMeredith,不知道,我对javax.script
几乎没有经验-(“在@CompileStatic上,除了扩展之外,你不会得到任何元编程”-这是不正确的。即使在@CompileStatic
下,你仍然可以利用编译时元编程。@CompileStatic
不允许大多数运行时元编程,但它允许其他类型的元编程(如AST转换)。