`
RednaxelaFX
  • 浏览: 3049411 次
  • 性别: Icon_minigender_1
  • 来自: 海外
社区版块
存档分类
最新评论

嵌入Groovy脚本时添加一些默认import

阅读更多
刚才给在做的项目里加了些便捷功能,把做法记下来。
我们在Java应用里嵌入了Groovy脚本。为了方便,业务里经常用的一些类可以默认import进来,让大家少写点重复代码。幸好,这种功能用Groovy来做毫不费力。

import groovy.lang.GroovyClassLoader;

import java.security.CodeSource;

import org.codehaus.groovy.ast.ClassHelper;
import org.codehaus.groovy.ast.ModuleNode;
import org.codehaus.groovy.control.CompilationFailedException;
import org.codehaus.groovy.control.CompilationUnit;
import org.codehaus.groovy.control.CompilerConfiguration;
import org.codehaus.groovy.control.Phases;
import org.codehaus.groovy.control.SourceUnit;
import org.codehaus.groovy.control.CompilationUnit.SourceUnitOperation;

public class CustomGroovyClassLoader extends GroovyClassLoader {
    private final String[] DEFAULT_IMPORT_CLASSES = {
        "rednaxelafx.sample.Foo",
        "rednaxelafx.sample.Bar"
    };
    
    /**
     * Validate classes.
     *
     * Because the specified default import classes might not be present in
     * the during runtime, they have to be validated first, otherwise Groovy
     * won't compile the code.
     * 
     * @param className the name of the class to validate
     * @return true iff the class exists and is valid
     */
    private boolean isClassValid(String className) {
        try {
            loadClass(className, false);
            return true;
        } catch (ClassNotFoundException e) {
            return false;
        }
    }
    
    private static String getClassSimpleName(final String className) {
        return className.substring(className.lastIndexOf('.') + 1);
    }
    
    private static boolean alreadyImported(final String alias, final ModuleNode ast) {
        return ast.getImport(alias) != null;
    }
    
    /**
     * add default imports
     */
    @Override
    protected CompilationUnit createCompilationUnit(
            CompilerConfiguration config, CodeSource source) {
        CompilationUnit compUnit = super.createCompilationUnit(config, source);
        compUnit.addPhaseOperation(new SourceUnitOperation() {
            public void call(SourceUnit source) throws CompilationFailedException {
                ModuleNode ast = source.getAST();
                for (String className : DEFAULT_IMPORT_CLASSES) {
                    String simpleClassName = getClassSimpleName(className);
                    if (isClassValid(className) && !alreadyImported(simpleClassName, ast)) {
                        ast.addImport(simpleClassName, ClassHelper.make(className));
                    }
                }
            }
        }, Phases.CONVERSION);
        return compUnit;
    }
}


直接用ast.addImport()的话,这些添加的“默认”import实际上是被append到原本的import列表的后面了。Groovy里后import的比先import的要更优先,所以这种默认import可能会带来干扰。要注意。
分享到:
评论
4 楼 RednaxelaFX 2011-02-25  
chenchao051 写道
看了你的JVM分享,写的非常不错,南大软院的同学,鼓励一下。继续加油啊。

我也正准备把Groovy引入项目,现在的生产力实在是低下。

哈哈,感谢^_^ 共同努力~
请问是哪一年级的同学?我是04
3 楼 chenchao051 2011-02-25  
看了你的JVM分享,写的非常不错,南大软院的同学,鼓励一下。继续加油啊。

我也正准备把Groovy引入项目,现在的生产力实在是低下。
2 楼 RednaxelaFX 2011-01-23  
lwwin 写道
嗯,用这个的话,应该比用啥BAT方便的多了=3=!

这跟BAT完全,是完全没有任何关系…
1 楼 lwwin 2011-01-23  
嗯,用这个的话,应该比用啥BAT方便的多了=3=!

相关推荐

    Java调用Groovy,实时动态加载数据库groovy脚本

    1. 引入Groovy库:在Java项目中添加Groovy的相关依赖,通常是`groovy-all`,确保Java能够访问Groovy运行时环境。 2. 创建GroovyClassLoader:使用这个类加载器可以动态加载和执行Groovy脚本。它继承自Java的...

    groovy脚本实现对数据库的增删改查

    在IT行业中,Groovy常被用于快速开发、脚本编写以及自动化任务,尤其在处理数据库操作时,其简洁的语法使得数据库的增删改查(CRUD)变得更加高效。 在“groovy脚本实现对数据库的增删改查”这个主题中,我们将深入...

    groovy脚本执行工具.zip

    Groovy是一种基于Java平台的动态、灵活的编程语言,它扩展了Java的语法,提供了简洁、易读的特性,使得编写脚本或者快速开发变得更加高效。这个“groovy脚本执行工具”是一个实用的工具包,专为在测试和开发过程中...

    基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口.zip

    GroovyShell允许在运行时执行Groovy脚本,而GroovyClassLoader则可以动态加载和执行新的类。在Java应用中,只需几行代码,就可以实现Groovy脚本的编译和执行: ```java GroovyShell shell = new GroovyShell(); ...

    干货:Jenkins Pipeline调用shell、python、java、groovy脚本的正确使用姿势.doc

    例如在服务器上执行 shell 命令、运行 python 或者 java 测试代码以及使用 groovy 脚本来实现一些更为复杂的功能等等。 执行 shell 命令 在 Jenkins Pipeline 中,使用 `sh` 指令可以执行 shell 命令。例如,使用 ...

    groovy脚本语言bin

    此外,Groovy还与Java无缝集成,可以调用所有Java库,并且Java代码也可以直接嵌入到Groovy脚本中。 总之,Groovy脚本语言bin提供的1.6.5版本是一个全面的开发包,旨在支持开发人员在JVM上快速开发、测试和部署...

    Java整合Groovy脚本笔记

    Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合Groovy脚本,Java整合Groovy脚本Java整合...

    JVM 动态执行Groovy脚本的方法

    本文将详细讲解如何使用JVM动态执行Groovy脚本的方法,主要包括利用JShell执行代码、调试模式下动态执行代码以及利用javax.script包执行Groovy脚本。以下是对各知识点的详细说明。 1. 利用JShell执行代码 Java 9 ...

    SoapUI插件实现import groovy功能

    为了导入Groovy库,你可以使用`import`关键字,如 `import some.package.YourClass`,这样就可以在脚本中使用该类的功能。 对于`import groovy`,通常意味着你想要引入Groovy标准库或者其他第三方Groovy库。例如,...

    Groovy脚本开发

    Android Studio中的Gradle开发脚本语言Groovy,Groovy入门,以及精通

    Groovy脚本:Java平台的动态编程利器

    Groovy不仅支持静态类型检查,还可以在运行时动态地编译和执行代码,这使得它在Java平台中的应用场景非常广泛。本文将详细介绍Groovy脚本的基本概念、特点、用途以及如何在Java平台中使用Groovy进行动态编程。 ...

    Groovy脚本:Java平台自动化测试的灵活选择

    在自动化测试领域,Groovy脚本以其在Java平台上的卓越性能和灵活性,成为了开发者的热门选择。Groovy是一种基于JVM的动态编程语言,它不仅继承了Java的强大功能,还引入了动态类型、闭包、DSL等现代编程特性,使得...

    groovy脚本转painless语法总结

    项目从es2升级到es6,groovy脚本也要相应的转换为painless脚本,转换过程中遇到了很多坑,特此总结成文档,供大家一起交流学习。

    Groovy和Xquery脚本JSON和XML解析工具

    脚本解析工具,可使用Groovy或Xquery解析JSON报文或XML报文

    java应用简单嵌入脚本模块

    在Java应用程序中嵌入脚本模块是一项常见的任务,它允许我们动态执行代码或者在运行时扩展应用程序的功能。这里我们将深入探讨如何使用Groovy脚本语言作为嵌入式脚本模块,以及它在Java开发中的应用。 Groovy是一种...

    Groovy在Spring中的简单使用

    在 Spring 配置文件中,需要添加 lang 的名字空间,以便识别 Groovy 脚本。然后,定义一个 Groovy bean,例如 helloWorldService,使用 script-source 属性指定 Groovy 脚本的位置,并使用 property 元素设置该脚本...

    cpi-groovy-examples:SAP CPI的Groovy脚本示例

    CPI的Groovy脚本示例Groovy脚本是SAP Cloud Platform Integration(CPI)不可或缺的重要功能该存储库的目标是: 实施新脚本时提供模板轻松找到与CPI主题相关的Groovy函数减少常见任务的搜索引擎时间为初学者提供教育...

    java 动态脚本语言 精通 Groovy

    这通过MetaClass机制实现,可以在运行时添加方法或者属性,极大地增强了代码的灵活性。 4. **闭包(Closures)**:Groovy中的闭包是其核心特性之一,类似于函数引用,可以作为参数传递,也可以作为返回值。闭包在...

    java在嵌入运行groovy代码1

    Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...

Global site tag (gtag.js) - Google Analytics