文档章节

Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c

donkeyMeng
 donkeyMeng
发布于 2016/03/05 12:19
字数 751
阅读 67
收藏 11

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


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


具体的实现步骤:


1.cglib的jar包(cglib-nodep):我用的是cglib-nodep-2.2.jar


------------------------------------------分割线------------------------------------------


免费下载地址在 http://linux.linuxidc.com/


用户名与密码都是www.linuxidc.com


具体下载目录在 /2014年资料/11月/3日/Java动态生成类以及动态添加属性/


下载方法见 http://www.linuxidc.com/Linux/2013-07/87684.htm


------------------------------------------分割线------------------------------------------


2.封装的cglib类:


package com.citics.test.model;

import java.util.Iterator;

import java.util.Map;

import java.util.Set;


import net.sf.cglib.beans.BeanGenerator;

import net.sf.cglib.beans.BeanMap;


public class DynamicBean {


 private  Object object = null;//动态生成的类

 private  BeanMap beanMap = null;//存放属性名称以及属性的类型


 public DynamicBean() {

  super();

 }

 

 @SuppressWarnings("rawtypes")

 public DynamicBean(Map propertyMap) {

  this.object = generateBean(propertyMap);

  this.beanMap = BeanMap.create(this.object);

 }


 /**

  * 给bean属性赋值

  * @param property 属性名

  * @param value 值

  */

 public void setValue(Object property, Object value) {

  beanMap.put(property, value);

 }


 /**

  * 通过属性名得到属性值

  * @param property 属性名

  * @return

  */

 public Object getValue(String property) {

  return beanMap.get(property);

 }


 /**

  * 得到该实体bean对象

  * @return

  */

 public Object getObject() {

  return this.object;

 }


 /**

  * @param propertyMap

  * @return

  */

 @SuppressWarnings("rawtypes")

 private Object generateBean(Map propertyMap) {

  BeanGenerator generator = new BeanGenerator();

  Set keySet = propertyMap.keySet();

  for (Iterator i = keySet.iterator(); i.hasNext();) {

    String key = (String) i.next();

    generator.addProperty(key, (Class) propertyMap.get(key));

  }

  return generator.create();

 }

 

}


3.需求的实现类:


package com.citics.platformx.test.controller;



import java.beans.BeanInfo;

import java.beans.Introspector;

import java.beans.PropertyDescriptor;

import java.io.InputStream;

import java.lang.reflect.Method;

import java.util.ArrayList;

import java.util.HashMap;

import java.util.Iterator;

import java.util.List;

import java.util.Properties;

import java.util.Set;


import com.citics.test.model.DynamicBean;

import com.citics.test.model.LeapRole;



public class ClassUtil {

 private  String filepath="/config/";//配置文件路径

 public String getFilepath() {

  return filepath;

 }

 public void setFilepath(String filepath) {

  this.filepath = filepath;

 }

 @SuppressWarnings({ "rawtypes","unchecked"})

 public Object dynamicClass(Object object) throws Exception{

  HashMap returnMap = new HashMap();

  HashMap typeMap=new HashMap();

  //读取配置文件

  Properties prop=new Properties();

  String sourcepackage=object.getClass().getName();

  String classname=sourcepackage.substring(sourcepackage.lastIndexOf(".")+1);

  InputStream in=ClassUtil.class.getResourceAsStream(filepath+classname+".properties");

  prop.load(in);

  

  Set<String> keylist=prop.stringPropertyNames();

  

  Class type=object.getClass();

  BeanInfo beanInfo = Introspector.getBeanInfo(type);

  PropertyDescriptor[] propertyDescriptors=beanInfo.getPropertyDescriptors();

  for(int i=0;i<propertyDescriptors.length;i++){

   PropertyDescriptor descriptor=propertyDescriptors[i];

   String propertyName = descriptor.getName();

   if(!propertyName.equals("class")){

    Method readMethod=descriptor.getReadMethod();

    Object result = readMethod.invoke(object, new Object[0]);

    if (result != null) {

     returnMap.put(propertyName, result);

    } else {

     returnMap.put(propertyName, "");

    }

    typeMap.put(propertyName,  descriptor.getPropertyType());

   }

  }

  //加载配置文件中的属性

  Iterator<String> iterator=keylist.iterator();

  while(iterator.hasNext()){

   String key=iterator.next();

      returnMap.put(key, prop.getProperty(key));

      typeMap.put(key, Class.forName("java.lang.String"));

  }

  //map转换成实体对象

  DynamicBean bean = new DynamicBean(typeMap); 

  //赋值

  Set keys=typeMap.keySet();

  for(Iterator it=keys.iterator();it.hasNext();){

   String key = (String) it.next();

   bean.setValue(key, returnMap.get(key));

  }

  Object obj=bean.getObject();

  return obj;

 }

 public static void main(String[] args) throws Exception{

  new ClassUtil().dynamicClass(new LeapRole());

 }

}


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


本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2014-11/108908.htm


本文转载自:http://www.linuxidc.com/Linux/2014-11/108908.htm

donkeyMeng
粉丝 3
博文 29
码字总数 8064
作品 0
丰台
程序员
私信 提问
Groovy核心类源码讲解(终)

前两篇groovy我们从源码的角度分析了,groovy对java做了那些扩展和这些扩展的实现的原理,今天这篇文章,我们来讲解groovy源码分析中的最后一部分,来分析一下groovy中最后一部分对java做了那...

qndroid
2018/07/19
0
0
Android NDK :在 C语言代码中输出Log

Android NDK :在 C语言代码中输出Log 本篇文章来源于 Linux公社网站(www.linuxidc.com) 原文链接:http://www.linuxidc.com/Linux/2012-07/66106.htmAndroid NDK 开发时,想要在 .c 文件中打...

zhangyujsj
2014/03/16
0
0
linux web篇---之三--tomcat

一、java概述 1、java的四个独立却又相关的技术: java程序设计语言: java源程序 java API: 以连接java的库文件,官方提供很多库文件,以提高java的开发速度,通过API连接到相应的库文件。...

kuang_hp
2018/07/04
0
0
慕课分享:盘点2014年热门免费开发课程

这篇文章来自慕课网团队的分享,文章从前端开发、后端开发、移动开发和OS 四个方面,分享了2014年度的热门免费课程。 前端开发 《HTML+CSS基础课程》 这门课程从最基本的概念开始讲起,步步深...

2014/12/30
0
0
0016-Avro序列化&反序列化和Spark读取Avro数据

1.简介 本篇文章主要讲如何使用java生成Avro格式数据以及如何通过spark将Avro数据文件转换成DataSet和DataFrame进行操作。 1.1Apache Arvo是什么? Apache Avro 是一个数据序列化系统,Avro提...

Hadoop实操
2018/11/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

代码持续自动发布

需求: 自动更新私人gitbook项目代码 如果代码没更新,不做务必要的构建操作 思路 定时任务加shell脚本,无论更新没更新都执行git pull。 优点:能满足需求 资源浪费,代码仓库不更新也执行p...

阿dai学长
23分钟前
6
0
sparkstreaming原理

Spark Streaming是Spark生态系统当中一个重要的框架,它建立在Spark Core之上,下面这幅图也可以看出Sparking Streaming在Spark生态系统中地位。 Spark Streaming是Spark Core的扩展应用,它...

七旬少女
43分钟前
0
0
springmvc集成cas,并解决前后端分离情况

1.最近项目需要集成已经存在的cas系统。 但是目前已集成的系统都是jsp。而我们项目是前后端分离开发(伪),没有分开部署。 2.cas原理就不介绍了 网上例子很多。基本都是使用302重定向实现的...

起名字什么的太麻烦了
58分钟前
4
0
HDFS-原理

1. 写操作 客户端要向HDFS写数据,首先要跟Namenode通信以确认可以写文件并获得接收文件block的Datanode,然后,客户端按顺序将文件逐个block传递给相应Datanode,并由接收到block的Datanod...

叶枫啦啦
今天
3
0
聊聊elasticsearch的MembershipAction

序 本文主要研究一下elasticsearch的MembershipAction MembershipAction elasticsearch-6.7.1/server/src/main/java/org/elasticsearch/discovery/zen/MembershipAction.java public class M......

go4it
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部