`
RednaxelaFX
  • 浏览: 3063242 次
  • 性别: 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=!

相关推荐

    groovy基础语法.pdf

    Groovy支持模块化编程,可以通过import语句导入其他Groovy脚本或Java类。同时,Groovy允许以脚本的形式运行代码,这意味着可以快速执行代码片段而无需编写完整的类和方法。 元编程: Groovy提供了强大的元编程能力...

    java脚本编程

    - **使用Groovy脚本**:在Java程序中可以通过`groovy.lang.GroovyShell`或`groovy.lang.GroovyClassLoader`来执行Groovy脚本。 #### 六、总结 虽然“Java脚本编程”这个说法可能并不准确,但在Java中确实可以通过...

    Groovy轻松入门

    此外,Groovy的GString(Groovy字符串)允许在字符串中嵌入表达式,提供模板化的字符串生成: ```groovy def name = "Alice" def age = 25 println "My name is ${name} and I am ${age} years old." ``` Groovy还有...

    java脚本 快速学习

    JSAPI通过提供ScriptEngine接口,使得开发者能够轻松地调用不同脚本引擎,如JavaScript、Groovy或Rhino,执行脚本代码。以下是一个简单的示例,展示了如何使用JSAPI执行JavaScript脚本: ```java import javax....

    Grails帮助文档

    Grails默认使用GSP(Groovy Server Pages)作为视图模板,允许开发者在HTML中嵌入Groovy代码,实现动态渲染。例如,`HelloController`的`index.gsp`视图可能如下所示: ```html <!DOCTYPE html> <title>Hello, ...

    Android与Lua互调的全注释简易Demo

    在Android平台上,有时候为了实现...通过 Luaj 库,我们可以轻松地在Android应用中嵌入Lua脚本,实现动态逻辑处理,降低开发复杂度。记住,安全总是首要考虑的因素,因此确保在允许Lua代码执行时采取适当的防护措施。

    张孝祥培训教程文档和源码

    9. **脚本引擎**:支持JavaScript、Groovy等脚本语言的嵌入,促进了不同语言之间的交互。 "Java基础加强代码.rar"可能包含了这些特性的示例代码,帮助学习者理解和实践。而"Java基础加强相关文档.rar"则可能包含...

    iReport-Ultimate-Guide中文手册

    除了基本属性外,用户还可以为报表元素添加自定义属性,以便于在表达式或脚本中引用。这些自定义属性可以用来控制元素的行为或外观。 ##### 5.6 图形元素 iReport支持多种图形元素,包括线条、矩形、椭圆等。这些...

    jdk1.5/1.6/1.7新特性

    - JSR 223 是 Java Web 组件的一个规范,它为在 Java 应用程序中嵌入脚本语言提供了支持。 - 通过 JSR 223,可以在 Java 应用程序中轻松地使用如 JavaScript、Groovy 等脚本语言。 4. **图形用户界面(GUI)组件...

Global site tag (gtag.js) - Google Analytics