首页 > 技术文章 > java中使用Groovy动态生成类通过反射操作用于model需要动态成员属性的业务场景

duiyuedangge 2021-11-26 21:59 原文

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

推荐阅读