groovy的调用传值

使用 GroovyClassLoader 和 Method 对象

注:因为Groovy完全兼容java代码,所以事例的groovy脚本是以java进行编写的

public class Main {

    @Test
    void tesBasic() throws Exception {
        String script = "class HelloWorld {\n" +
                "    void sayHello(String name) {\n" +
                "        System.out.printf(\"你好:\"+name);\n" +
                "    }\n" +
                "}";
        GroovyClassLoader classLoader = new GroovyClassLoader();
        Class<?> groovyClass = classLoader.parseClass(script);

        Object instance = groovyClass.getDeclaredConstructor().newInstance();
        Method method = groovyClass.getMethod("sayHello", String.class);

        method.invoke(instance, "Tom");
    }

    @Test
    void TestHigh() throws Exception {
        // 复杂写法
        Map<String,String> map = new HashMap<>();
        map.put("name","jeffery");
        map.put("age","17");
        Object[] params2 = new Object[2];
        params2[0]=map;
        params2[1] = "jeffery";

        String script =
                "package com.test;"+
                "import java.util.Map;\n" +
                "\n" +
                "class TestHigh {\n" +
                "\n" +
                "    String printMapToString(Map<String, String> paramMap,String name) {\n" +
                "        StringBuilder stringBuilder = new StringBuilder();\n" +
                "        paramMap.forEach( (key, value) ->\n" +
                "                stringBuilder.append(\"key:\" + key + \";value:\" + value)\n" +
                "        );\n" +
                        "stringBuilder.append(name);"+
                "        return stringBuilder.toString();\n" +
                "    }\n" +
                "\n" +
                "}";

        GroovyClassLoader classLoader = new GroovyClassLoader();
        Class<?> groovyClass = classLoader.parseClass(script);
        Object instance = groovyClass.getDeclaredConstructor().newInstance();
        Method method = groovyClass.getMethod("printMapToString", Map.class,String.class);
        System.out.println(method.invoke(instance, params2));

        // 根据类名获取实例
        System.out.println("根据类名获取实例");
        Object instance2 =classLoader.loadClass("com.test.TestHigh").getDeclaredConstructor().newInstance();
        Method method2 = classLoader.loadClass("com.test.TestHigh").getMethod("printMapToString", Map.class,String.class);
        System.out.println(method2.invoke(instance2, params2));

    }
}

Basic写法

在上面的代码中,我们首先创建了一个 GroovyClassLoader 对象,并使用它加载 Groovy 脚本文件。然后,我们使用 newInstance 方法创建 Groovy 类的实例,并使用 getMethod 方法获取 Groovy 类中的方法。最后,我们使用 invoke 方法调用 Groovy 类中的方法,并传递一个参数。

High写法

基本流程同basic,只不过在high的写法中传入多个参数,且多了一个当类被类加载器加载完成后,通过类名进行加载。

posted @ 2023-07-05 18:58  度一川  阅读(174)  评论(0)    收藏  举报