刚才给在做的项目里加了些便捷功能,把做法记下来。
我们在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可能会带来干扰。要注意。
分享到:
相关推荐
1. 引入Groovy库:在Java项目中添加Groovy的相关依赖,通常是`groovy-all`,确保Java能够访问Groovy运行时环境。 2. 创建GroovyClassLoader:使用这个类加载器可以动态加载和执行Groovy脚本。它继承自Java的...
在IT行业中,Groovy常被用于快速开发、脚本编写以及自动化任务,尤其在处理数据库操作时,其简洁的语法使得数据库的增删改查(CRUD)变得更加高效。 在“groovy脚本实现对数据库的增删改查”这个主题中,我们将深入...
Groovy是一种基于Java平台的动态、灵活的编程语言,它扩展了Java的语法,提供了简洁、易读的特性,使得编写脚本或者快速开发变得更加高效。这个“groovy脚本执行工具”是一个实用的工具包,专为在测试和开发过程中...
GroovyShell允许在运行时执行Groovy脚本,而GroovyClassLoader则可以动态加载和执行新的类。在Java应用中,只需几行代码,就可以实现Groovy脚本的编译和执行: ```java GroovyShell shell = new GroovyShell(); ...
例如在服务器上执行 shell 命令、运行 python 或者 java 测试代码以及使用 groovy 脚本来实现一些更为复杂的功能等等。 执行 shell 命令 在 Jenkins Pipeline 中,使用 `sh` 指令可以执行 shell 命令。例如,使用 ...
此外,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整合...
本文将详细讲解如何使用JVM动态执行Groovy脚本的方法,主要包括利用JShell执行代码、调试模式下动态执行代码以及利用javax.script包执行Groovy脚本。以下是对各知识点的详细说明。 1. 利用JShell执行代码 Java 9 ...
为了导入Groovy库,你可以使用`import`关键字,如 `import some.package.YourClass`,这样就可以在脚本中使用该类的功能。 对于`import groovy`,通常意味着你想要引入Groovy标准库或者其他第三方Groovy库。例如,...
Android Studio中的Gradle开发脚本语言Groovy,Groovy入门,以及精通
Groovy不仅支持静态类型检查,还可以在运行时动态地编译和执行代码,这使得它在Java平台中的应用场景非常广泛。本文将详细介绍Groovy脚本的基本概念、特点、用途以及如何在Java平台中使用Groovy进行动态编程。 ...
在自动化测试领域,Groovy脚本以其在Java平台上的卓越性能和灵活性,成为了开发者的热门选择。Groovy是一种基于JVM的动态编程语言,它不仅继承了Java的强大功能,还引入了动态类型、闭包、DSL等现代编程特性,使得...
项目从es2升级到es6,groovy脚本也要相应的转换为painless脚本,转换过程中遇到了很多坑,特此总结成文档,供大家一起交流学习。
脚本解析工具,可使用Groovy或Xquery解析JSON报文或XML报文
在Java应用程序中嵌入脚本模块是一项常见的任务,它允许我们动态执行代码或者在运行时扩展应用程序的功能。这里我们将深入探讨如何使用Groovy脚本语言作为嵌入式脚本模块,以及它在Java开发中的应用。 Groovy是一种...
在 Spring 配置文件中,需要添加 lang 的名字空间,以便识别 Groovy 脚本。然后,定义一个 Groovy bean,例如 helloWorldService,使用 script-source 属性指定 Groovy 脚本的位置,并使用 property 元素设置该脚本...
CPI的Groovy脚本示例Groovy脚本是SAP Cloud Platform Integration(CPI)不可或缺的重要功能该存储库的目标是: 实施新脚本时提供模板轻松找到与CPI主题相关的Groovy函数减少常见任务的搜索引擎时间为初学者提供教育...
这通过MetaClass机制实现,可以在运行时添加方法或者属性,极大地增强了代码的灵活性。 4. **闭包(Closures)**:Groovy中的闭包是其核心特性之一,类似于函数引用,可以作为参数传递,也可以作为返回值。闭包在...
Java 嵌入运行 Groovy 代码是一种常见的技术实践,特别是在需要动态脚本执行或灵活扩展功能的场景中。Groovy 是一种与 Java 兼容的动态编程语言,它的语法简洁,适合编写脚本和快速原型开发。在 Java 应用程序中运行...