java中如何访问类中的字段_java – GroovyScript匿名类中的字段访问

在Groovy 2.1.6脚本中我定义了一个字段:

import groovy.transform.Field

@Field String test = "abc";

println "Script: ${test}";

def run = new Runnable() {

void run() {

println "Runnable0: ${test}";

new Runnable() {

void run() {

println "Runnable1: ${test}";

}

}.run();

}

}.run();

当从脚本中的匿名类(如here)访问它时,Groovy似乎尝试将此Field强制转换为Reference,并在定义Runnable后立即抛出以下异常:

org.codehaus.groovy.runtime.typehandling.GroovyCastException: Cannot cast object 'abc' with class 'java.lang.String' to class 'groovy.lang.Reference'

at bug1.run(bug1:5)

另外,如果我将匿名Runnables放在像here这样的函数中,Groovy在转换时没有问题,但是在内部Runnable中找不到Field:

groovy.lang.MissingFieldException: No such field: test for class: bug2$1

at bug2$1.this$dist$get$1(bug2.groovy)

at bug2$1$2.propertyMissing(bug2.groovy)

at bug2$1$2.run(bug2.groovy:14)

at java_lang_Runnable$run.call(Unknown Source)

at bug2$1.run(bug2.groovy:12)

at java_lang_Runnable$run.call(Unknown Source)

at bug2.fun(bug2.groovy:9)

at bug2.run(bug2.groovy:5)

这可以通过重新定义像here这样的字段来修复

,但此修复仅适用于函数内部

这是Groovy中的错误还是我只是违反了一些规则而Groovy只缺少正确的例外?

最佳答案 如果您调用匿名类并引用字段变量,则不需要@Field转换.

原因:

当脚本中的严格类型变量定义为@Field时,该变量(在编译时[AST转换])在该脚本中被视为私有.因此财产缺失.

为了实现差异,只需从Groovy控制台在AST浏览器中可视化脚本,并在两种情况下都进行“语义分析”阶段(没有和使用@Field),你会注意到变量是本地的run()用于主要脚本分别与全局定义相比.

推论:

另一方面,当在同一脚本内的方法中使用严格类型化的变量时,@ Field转换很有用,因为没有@Field,该字段将在脚本的run()方法中声明为局部变量,因此不会其他方法可见.

摘录自AST browser以获取详细信息.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值