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
