本人在项目中遇到这么个需求,有一个模块的server方法需要频繁修改 经阅读可以使用 Groovy 使用java脚本来时
pom坐标
<dependency>
<groupId>org.codehaus.groovy</groupId>
<artifactId>groovy</artifactId>
<version>3.0.9</version>
</dependency>
实例代码
public interface IGroovyHandler {
List<JSONObject> transform(List<JSONObject> data);
}
动态加载
@Component
@Slf4j
public class GroovyTransformServiceImpl implements TransformStrategy {
private GroovyClassLoader groovyClassLoader = new GroovyClassLoader();
/**
* 数据清洗转换 类型
*
* @return
*/
@Override
public String type() {
return "javaBean";
}
/***
* 清洗转换算法接口
* @param def
* @param data
* @return
*/
@Override
public List<JSONObject> transform(DataSetTransformDto def, List<JSONObject> data) {
String transformScript = def.getTransformScript();
Class<?> clazz = groovyClassLoader.parseClass(transformScript);
if (clazz != null) {
try {
Object instance = clazz.newInstance();
if (instance!=null) {
if (instance instanceof IGroovyHandler) {
IGroovyHandler handler = (IGroovyHandler) instance;
return handler.transform(data);
} else {
System.err.println("转换失败!");
}
}
} catch (Exception e) {
log.info("执行javaBean异常", e);
throw new RuntimeException(e.getMessage());
}
}
return data;
}
}
java 脚本 在idea中写好之后 转化成字符串 运行
package com;
import com.alibaba.fastjson.JSONObject;
import com.anjiplus.template.gaea.business.modules.datasettransform.service.IGroovyHandler;
import java.util.ArrayList;
import java.util.List;
/**
* 建议在idea写好复制整个类到此处,位置report-core/src/test/java/com/DemoGroovyHandler.java
*/
public class DemoGroovyHandler implements IGroovyHandler {
@Override
public List<JSONObject> transform(List<JSONObject> data) {
for (JSONObject datum : data) {
List<Double> value = new ArrayList<>();
Double longitude = datum.getDouble("longitude");
Double latitude = datum.getDouble("latitude");
value.add(longitude);
value.add(latitude);
datum.put("value", value);
datum.put("name", "");
datum.remove("longitude")
datum.remove("latitude")
}
return data;
}
}
demo代码
import groovy.lang.GroovyClassLoader;
import groovy.lang.GroovyObject;
import java.lang.reflect.InvocationTargetException;
public class GroovyTest {
public static void main(String[] args) throws Exception {
//test01();
test02();
}
private static void test02() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
GroovyClassLoader loader = new GroovyClassLoader();
// java代码
String java = "import java.sql.*;\n" +
"import java.util.ArrayList;\n" +
"import java.util.HashMap;\n" +
"import java.util.List;\n" +
"import java.util.Map;\n" +
"\n" +
"public class JDBCTest {\n" +
" \n" +
" private static List<Map> getData() {\n" +
" // 数据库URL,用户名和密码\n" +
" String url = \"jdbc:mysql://172.16.90.xxx:3306/xx\";\n" +
" String user = \"root\";\n" +
" String password = \"123456\";\n" +
"\n" +
" Connection conn = null;\n" +
" Statement stmt = null;\n" +
" ResultSet rs = null;\n" +
" List<Map> data = new ArrayList<>();\n" +
" try {\n" +
" // 加载数据库驱动\n" +
" Class.forName(\"com.mysql.cj.jdbc.Driver\");\n" +
"\n" +
" // 建立连接\n" +
" conn = DriverManager.getConnection(url, user, password);\n" +
"\n" +
" // 创建Statement对象\n" +
" stmt = conn.createStatement();\n" +
"\n" +
" // 执行查询\n" +
" rs = stmt.executeQuery(\"SELECT kdmc FROM frm_wlxx\");\n" +
"\n" +
" // 获取结果集的元数据\n" +
" ResultSetMetaData rsmd = rs.getMetaData();\n" +
"\n" +
" // 获取列数\n" +
" int columnsCount = rsmd.getColumnCount();\n" +
"\n" +
" // 遍历每一行数据\n" +
" while (rs.next()) {\n" +
" Map obj = new HashMap();\n" +
" for (int i = 1; i <= columnsCount; i++) {\n" +
" // 获取列名\n" +
" String columnName = rsmd.getColumnName(i);\n" +
" // 获取对应列的值\n" +
" Object columnValue = rs.getObject(i);\n" +
"\n" +
" obj.put(columnName, columnValue);\n" +
"\n" +
" }\n" +
" data.add(obj);\n" +
" }\n" +
" // 处理结果\n" +
"// while (rs.next()) {\n" +
"// String string = rs.getString(\"kdmc\");\n" +
"\n" +
"\n" +
"// String query =\"SELECT kdmc FROM frm_wlxx where kdmc=?\";\n" +
"//\n" +
"// PreparedStatement pstmt = conn.prepareStatement(query);\n" +
"//\n" +
"// pstmt.setString(1, string);\n" +
"//\n" +
"// ResultSet child = pstmt.executeQuery();\n" +
"// while (child.next()) {\n" +
"// String childObj = child.getString(\"kdmc\");\n" +
"// System.out.println(childObj);\n" +
"// }\n" +
"// }\n" +
" } catch (Exception e) {\n" +
" e.printStackTrace();\n" +
" } finally {\n" +
" // 关闭资源\n" +
" try {\n" +
" if (rs != null) {\n" +
" rs.close();\n" +
" rs = null;\n" +
" }\n" +
" if (stmt != null) {\n" +
" stmt.close();\n" +
" stmt = null;\n" +
" }\n" +
" if (conn != null) {\n" +
" conn.close();\n" +
" conn = null;\n" +
" }\n" +
" } catch (Exception e) {\n" +
" e.printStackTrace();\n" +
" }\n" +
" }\n" +
" return data;\n" +
" }\n" +
"}\n";
Class scriptClass = loader.parseClass(java);
GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();
Object result = scriptInstance.invokeMethod("getData", new Object[]{});
System.out.println("Groovy result=" + result);
}
private static void test01() throws InstantiationException, IllegalAccessException, InvocationTargetException, NoSuchMethodException {
GroovyClassLoader loader = new GroovyClassLoader();
// java代码
String java = " " +
" public class Test { " +
" public int add(double a, double b) { " +
" double sum = a + b; " +
" System.out.println(\"Script sum=\" + sum); " +
" return sum.intValue(); " +
" } " +
" } ";
Class scriptClass = loader.parseClass(java);
GroovyObject scriptInstance = (GroovyObject) scriptClass.getDeclaredConstructor().newInstance();
Object result = scriptInstance.invokeMethod("add", new Object[]{1, 2});
System.out.println("Groovy result=" + result);
}
}