Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Groovy @TypeChecked和@CompileStatic之间的差异_Groovy - Fatal编程技术网

Groovy @TypeChecked和@CompileStatic之间的差异

Groovy @TypeChecked和@CompileStatic之间的差异,groovy,Groovy,有人能解释一下@TypeChecked和@CompileStatic之间的区别吗 我读到@TypeChecked不可能在运行时添加新方法。 还有哪些功能是不允许的 @CompileStatic允许哪些Groovy功能? 与groovyc和@CompileStatic相比,字节码是否与使用javac编译的字节码相同 主要区别在于MOP(元对象协议):@TypeChecked让方法通过MOP,而@CompileStatic生成类似于Java字节码的方法调用。这意味着它们的语义不同,但也意味着您仍然可

有人能解释一下@TypeChecked和@CompileStatic之间的区别吗

我读到@TypeChecked不可能在运行时添加新方法。 还有哪些功能是不允许的

@CompileStatic允许哪些Groovy功能?
与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
    ,但也会在运行时将代码修改为类型安全,这意味着使用动态编程的方法将中断

在实施DSL时,您会使用哪一个?假设尽早识别用户DSL脚本中的错误是最佳选择。@KevinMeredith
@TypeChecked
。它允许拖把的东西。它将使DSL引擎的代码更加冗长(即,您不能返回方法上的映射,必须使用定义良好的方法返回对象),但它会更早地发现问题。请注意,这禁止了一些非常酷的东西,例如。您以前使用过
javax.script.*
@TypeChecked
吗?我不确定该注释是否可以用于?@KevinMeredith,不知道,我对
javax.script
几乎没有经验-(“在@CompileStatic上,除了扩展之外,你不会得到任何元编程”-这是不正确的。即使在
@CompileStatic
下,你仍然可以利用编译时元编程。
@CompileStatic
不允许大多数运行时元编程,但它允许其他类型的元编程(如AST转换)。