ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-03 15:48:13  阅读:305  来源: 互联网

标签:java groovy anonymous-class


在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以获取详细信息.

标签:java,groovy,anonymous-class
来源: https://codeday.me/bug/20190703/1368083.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有