有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件。

那么技术实现支持:使用CGLib代理。

具体的实现步骤:

1.配置Maven文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.journey</groupId>
  7. <artifactId>journey</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <dependencies>
  10. <dependency>
  11. <groupId>cglib</groupId>
  12. <artifactId>cglib</artifactId>
  13. <version>2.2.2</version>
  14. </dependency>
  15. </dependencies>
  16. </project>

2.封装的cglib类

  1. package com.journey;
  2. import net.sf.cglib.beans.BeanGenerator;
  3. import net.sf.cglib.beans.BeanMap;
  4. import java.util.Iterator;
  5. import java.util.Map;
  6. import java.util.Set;
  7. /**
  8. * Created by little_eleventh_wolf on 2017/11/18.
  9. */
  10. public class DynamicBean {
  11. private Object object = null; //动态生成的类
  12. private BeanMap beanMap = null; //存放属性名称以及属性的类型
  13. public DynamicBean() {
  14. super();
  15. }
  16. public DynamicBean(Map propertyMap) {
  17. this.object = generateBean(propertyMap);
  18. this.beanMap = BeanMap.create(this.object);
  19. }
  20. /**
  21. * @param propertyMap
  22. * @return
  23. */
  24. private Object generateBean(Map propertyMap) {
  25. BeanGenerator generator = new BeanGenerator();
  26. Set keySet = propertyMap.keySet();
  27. for(Iterator i = keySet.iterator(); i.hasNext(); ) {
  28. String key = (String) i.next();
  29. generator.addProperty(key, (Class) propertyMap.get(key));
  30. }
  31. return generator.create();
  32. }
  33. /**
  34. * 给bean属性赋值
  35. * @param property 属性名
  36. * @param value 值
  37. */
  38. public void setValue(Object property, Object value) {
  39. beanMap.put(property, value);
  40. }
  41. /**
  42. * 通过属性名得到属性值
  43. * @param property 属性名
  44. * @return 值
  45. */
  46. public Object getValue(String property) {
  47. return beanMap.get(property);
  48. }
  49. /**
  50. * 得到该实体bean对象
  51. * @return
  52. */
  53. public Object getObject() {
  54. return this.object;
  55. }
  56. }

3.需求的实现类:

  1. package com.journey;
  2. import java.beans.BeanInfo;
  3. import java.beans.Introspector;
  4. import java.beans.PropertyDescriptor;
  5. import java.io.InputStream;
  6. import java.lang.reflect.Method;
  7. import java.util.HashMap;
  8. import java.util.Iterator;
  9. import java.util.Properties;
  10. import java.util.Set;
  11. /**
  12. * Created by little_eleventh_wolf on 2017/11/18.
  13. */
  14. public class ClassUtil {
  15. private String filePath = "/config/"; //配置文件路径
  16. public String getFilePath() {
  17. return filePath;
  18. }
  19. public void setFilePath(String filePath) {
  20. this.filePath = filePath;
  21. }
  22. public Object dynamicClass(Object object) throws Exception {
  23. HashMap returnMap = new HashMap();
  24. HashMap typeMap = new HashMap();
  25. //读取配置文件
  26. Properties prop = new Properties();
  27. String sourcepackage = object.getClass().getName();
  28. String classname = sourcepackage.substring(sourcepackage.lastIndexOf(".") + 1);
  29. InputStream in = ClassUtil.class.getResourceAsStream(filePath + classname + ".properties");
  30. prop.load(in);
  31. Set<String> keylist = prop.stringPropertyNames();
  32. Class type = object.getClass();
  33. BeanInfo beanInfo = Introspector.getBeanInfo(type);
  34. PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
  35. for(int i = 0; i < propertyDescriptors.length; i++) {
  36. PropertyDescriptor descriptor = propertyDescriptors[i];
  37. String propertyName = descriptor.getName();
  38. if(!propertyName.equals("class")) {
  39. Method readMethod = descriptor.getReadMethod();
  40. Object result = readMethod.invoke(object, new Object[0]);
  41. if(result != null) {
  42. returnMap.put(propertyName, result);
  43. } else {
  44. returnMap.put(propertyName, "");
  45. }
  46. typeMap.put(propertyName, descriptor.getPropertyType());
  47. }
  48. }
  49. //加载配置文件中的属性
  50. Iterator<String> iterator = keylist.iterator();
  51. while(iterator.hasNext()) {
  52. String key = iterator.next();
  53. returnMap.put(key, prop.getProperty(key));
  54. typeMap.put(key, Class.forName("java.lang.String"));
  55. }
  56. //map转换成实体对象
  57. DynamicBean bean = new DynamicBean(typeMap);
  58. //赋值
  59. Set keys = typeMap.keySet();
  60. for(Iterator it = keys.iterator(); it.hasNext(); ) {
  61. String key = (String) it.next();
  62. bean.setValue(key, returnMap.get(key));
  63. }
  64. Object obj = bean.getObject();
  65. return obj;
  66. }
  67. public static void main(String[] args) throws Exception {
  68. new ClassUtil().dynamicClass(new LeapRole()/*LeapRole是个普通类,未贴源码*/);
  69. }
  70. }

4.技术实现目的:前台框架表格数据源实际上就是带有数据的实体,但是grid中数据的类型、以及是否可见、toolbar工具栏上的按钮、是否分页,是针对实体而言,所以目前把这些信息作为实体的配置文件。在展示页面之前,读取全部信息,转为参数对象的完整对象

Java动态生成类以及动态添加属性的更多相关文章

  1. 【原】如何获取Java动态生成类?

    写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类, 有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子, 通过 ...

  2. python-获取类名和方法名,动态创建类和方法及属性

    获取类名和方法名1.在函数外部获取函数名称,用.__name__获取2.在函数内部获取当前函数名称,用sys._getframe().f_code.co_name方法获取3.使用inspect模块动态 ...

  3. Roslyn 编译器Api妙用:动态生成类并实现接口

    在上一篇文章中有讲到使用反射手写IL代码动态生成类并实现接口. 反射的妙用:C#通过反射动态生成类型继承接口并实现 有位网友推荐使用 Roslyn 去脚本化动态生成,今天这篇文章就主要讲怎么使用 Ro ...

  4. python类可以任意添加属性

    python类可以任意添加属性 class A(object): def __init__(self): self.name = "zhangsan" self.age = 18 ...

  5. Java学习笔记十四:如何定义Java中的类以及使用对象的属性

    如何定义Java中的类以及使用对象的属性 一:类的重要性: 所有Java程序都以类class为组织单元: 二:什么是类: 类是模子,确定对象将会拥有的特征(属性)和行为(方法): 三:类的组成: 属性 ...

  6. 利用Java反射根据类的名称获取属性信息和父类的属性信息

    代码: import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java ...

  7. Android 通过Java代码生成创建界面。动态生成View,动态设置View属性。addRules详解

    废话不多说,本文将会层层深入给大家讲解如何动态的生成一个完整的界面. 本文内容: Java代码中动态生成View Java代码中动态设置View的位置,以及其他的属性 LayoutParams详解 一 ...

  8. java ASM动态生成类

    BeanTest2.java import java.io.FileOutputStream; import org.objectweb.asm.AnnotationVisitor; import o ...

  9. JDK 工具 HSDB 查看动态生成类

    前置工作 1. 复制 JDK 安装目录\jre\bin\sawindbg.dll 到 JDK 安装目录同级的 jre\bin 目录下,否则会报错找不到 sawindbg.dll 文件. 比如我的 sa ...

随机推荐

  1. python之函数参数问题(参数为可变对象)

    今天看到一段代码,其中函数入参有一个参数为list,类似如下: def linux_monitor(pid=0,pidlist = []): pidlist.append(pid) 通过测试发现是有问 ...

  2. jenkins内部分享ppt

    持续集成Continuous integration简介(持续集成是什么)    .持续集成源于极限编程(XP),是一种软件实践,软件开发过程中集成步骤是一个漫长并且无法预测的过程.集成过程中可能会爆 ...

  3. 从零开始学 Web 之 JavaScript(一)JavaScript概述

    大家好,这里是「 Daotin的梦呓 」从零开始学 Web 系列教程.此文首发于「 Daotin的梦呓 」公众号,欢迎大家订阅关注.在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识 ...

  4. 从零开始学 Web 之 ES6(六)ES6基础语法四

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  5. PHP-CPP开发扩展(六)

    PHP-CPP是一个用于开发PHP扩展的C++库.本节讲解在C++中PHP异常.变量.常量的实现相关知识. 异常 PHP和C++都支持异常,而PHP-CPP库这两种语言之间的异常处理是完全透明的.你在 ...

  6. 以ActiveMQ为例JAVA消息中间件学习【2】

    前言 之前我们学习了什么是消息中间件,以ActiveMQ为例做了一个最简单的消息中间件的实现.但是我们做的就只能算是个例子而已,因为在实际的项目中肯定会有spring插一脚,所以spring肯定有来管 ...

  7. Kafka项目实战-用户日志上报实时统计之分析与设计

    1.概述 本课程的视频教程地址:<Kafka实战项目之分析与设计>  本课程我通过一个用户实时上报日志案例作为基础,带着大家去分析Kafka这样一个项目的各个环节,从而对项目的整体设计做比 ...

  8. 【ASP.NET MVC系列】浅谈ASP.NET 程序发布过程

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  9. CentOS7下查看系统环境(内存CPU磁盘使用率)

    1.方法一 yum install atop --安装atop sudo atop--开启监视 2.方法二 top 3.方法三 free --查看没存情况 ps ux --查看CPU 情况 磁盘 df

  10. C#时间格式转换为时间戳互转

    /// <summary> /// 将 DateTime时间格式转换为Unix时间戳格式 /// </summary> /// <param name="tim ...