日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

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

發布時間:2025/6/15 linux 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

2019獨角獸企業重金招聘Python工程師標準>>>

有個技術實現需求:動態生成類,其中類中的屬性來自參數對象中的全部屬性以及來自參數對象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


轉載于:https://my.oschina.net/mlh3823/blog/631379

總結

以上是生活随笔為你收集整理的Java动态生成类以及动态添加属性 本篇文章来源于 Linux公社网站(www.linuxidc.c的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。