1.什么是Groovy?
Groovy是一种基于JVM(Java虚拟机)的敏捷开发语言,它结合了Python、Ruby和Smalltalk的许多强大的特性,Groovy 代码能够与 Java 代码很好地结合,也能用于扩展现有代码。由于其运行在 JVM 上的特性,Groovy也可以使用其他非Java语言编写的库。
2.java中使用Groovy动态生成类以及通过反射使用和操作示例:
// 引入Groovy maven依赖 <dependency> <groupId>org.codehaus.groovy</groupId> <artifactId>groovy-all</artifactId> <version>2.4.13</version> </dependency> // 动态类对应的字符串 private String dynamicClassStr = "package com.mypage.bean;\n" + "\n" + "public class MessageInfo {\n" + " private static final long serialVersionUID = 1L;\n" + "\t\n" + "\t@myAnnotation\n" + " private Object data;//返回数据\n" + "\t\n" + " private Object jsonObject;//附带属性\n" + "\t\n" + " private String message;\n" + "\t\n" + " private int code = MessageCode.Success;\n" + "\n" + " public int getCode() {\n" + " return code;\n" + " }\n" + "\n" + " public void setCode(int code) {\n" + " this.code = code;\n" + " }\n" + "\n" + " public Object getData() {\n" + " return data;\n" + " }\n" + "\n" + " public void setData(Object data) {\n" + " this.data = data;\n" + " }\n" + "\n" + " public Object getJsonObject() {\n" + " return jsonObject;\n" + " }\n" + "\n" + " public void setJsonObject(Object jsonObject) {\n" + " this.jsonObject = jsonObject;\n" + " }\n" + "\n" + " public String getMessage() {\n" + " return message;\n" + " }\n" + "\n" + " public void setMessage(String message) {\n" + " this.message = message;\n" + " }\n" + "\n" + "}"; // 动态生成类示例 public void main(String args[]){ // 1.通过Groovy将字符串动态生成为动态类。groovy生成的类和普通的类没有任何区别,属性、方法、注解等都可以通过反射操作 GroovyClassLoader groovyClassLoader = new GroovyClassLoader(); Class<?> clazz = groovyClassLoader.parseClass(dynamicClassStr); // 2.新建一个动态类对象 Object obj = clazz.newInstance(); Object obj1 = clazz.newInstance(); // 3.通过反射,获取该类的成员变量,给对象设置值. // 通过反射获取字段Field是类的,该类的对象都可以用。如:f.set(obj, value),f.set(obj1, value) // 不用每个对象操作成员变量都重新获取Field,在需要反射操作泛型集合对象的时候,在获取到类class时,生成一次,集合中每个对象都可以用。 String fieldName = "message"; Field f = c.getDeclaredField(fieldName); // 取消语言访问检查 f.setAccessible(true); // 4.给变量赋值 f.set(obj, "hello~"); // 5.读值输出 System.out.println(f.get(obj)); }
// 在某些,类有固定成员和动态成员变量的业务场景,可以将固定成员建一个实体类,在整体生成一个动态类,固定成员的那部分数据,可以通过BeanUtils.copyProperties(targetObj,orgObject)填充数据。动态的那部分通过反射Field来填充。
参考链接:https://baike.baidu.com/item/Groovy/180590?fr=aladdin
参考链接:https://www.cnblogs.com/barrywxx/p/13233373.html
参考链接:https://www.cnblogs.com/xiaostudy/p/11642516.html