java中使用Groovy動態生成類通過反射操作用於model需要動態成員屬性的業務場景


1.什么是Groovy?

Groovy是一種基於JVMJava虛擬機)的敏捷開發語言,它結合了PythonRubySmalltalk的許多強大的特性,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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM