JAVA“动态”为类添加属性
部分参考:http://www.cnblogs.com/zy2009/p/6725843.html
pom.xml中添加:
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>1.9.3</version>
</dependency> <dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<version>3.2.4</version>
</dependency>
使用cglib动态生成类与使用 commons-beanutils获取源对象属性-类型集合,封装成新对象并设置值代码:
package com.frinder.util; import com.google.common.collect.Maps;
import com.kiktech.entity.LoggerEntity;
import net.sf.cglib.beans.BeanGenerator;
import net.sf.cglib.beans.BeanMap;
import org.apache.commons.beanutils.PropertyUtilsBean;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import java.beans.PropertyDescriptor;
import java.util.HashMap;
import java.util.Map; /**
* Created by frinder on 2017/7/18.
*/
public class ReflectUtil { static Logger logger = LoggerFactory.getLogger(ReflectUtil.class); public static Object getTarget(Object dest, Map<String, Object> addProperties) {
// get property map
PropertyUtilsBean propertyUtilsBean = new PropertyUtilsBean();
PropertyDescriptor[] descriptors = propertyUtilsBean.getPropertyDescriptors(dest);
Map<String, Class> propertyMap = Maps.newHashMap();
for (PropertyDescriptor d : descriptors) {
if (!"class".equalsIgnoreCase(d.getName())) {
propertyMap.put(d.getName(), d.getPropertyType());
}
}
// add extra properties
addProperties.forEach((k, v) -> propertyMap.put(k, v.getClass()));
// new dynamic bean
DynamicBean dynamicBean = new DynamicBean(dest.getClass(), propertyMap);
// add old value
propertyMap.forEach((k, v) -> {
try {
// filter extra properties
if (!addProperties.containsKey(k)) {
dynamicBean.setValue(k, propertyUtilsBean.getNestedProperty(dest, k));
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
});
// add extra value
addProperties.forEach((k, v) -> {
try {
dynamicBean.setValue(k, v);
} catch (Exception e) {
logger.error(e.getMessage(), e);
}
});
Object target = dynamicBean.getTarget();
return target;
} public static void main(String[] args) {
LoggerEntity entity = new LoggerEntity();
entity.setAppName("appname");
entity.setOperator("add");
entity.setResult("result");
entity.setUri("uri");
entity.setMethod("method");
Map<String, Object> addProperties = new HashMap() {{
put("hello", "world");
put("abc", "123");
}};
System.out.println(getTarget(entity, addProperties));
} public static class DynamicBean {
/**
* 目标对象
*/
private Object target; /**
* 属性集合
*/
private BeanMap beanMap; public DynamicBean(Class superclass, Map<String, Class> propertyMap) {
this.target = generateBean(superclass, propertyMap);
this.beanMap = BeanMap.create(this.target);
} /**
* bean 添加属性和值
*
* @param property
* @param value
*/
public void setValue(String property, Object value) {
beanMap.put(property, value);
} /**
* 获取属性值
*
* @param property
* @return
*/
public Object getValue(String property) {
return beanMap.get(property);
} /**
* 获取对象
*
* @return
*/
public Object getTarget() {
return this.target;
} /**
* 根据属性生成对象
*
* @param superclass
* @param propertyMap
* @return
*/
private Object generateBean(Class superclass, Map<String, Class> propertyMap) {
BeanGenerator generator = new BeanGenerator();
if (null != superclass) {
generator.setSuperclass(superclass);
}
BeanGenerator.addProperties(generator, propertyMap);
return generator.create();
}
} }
LoggerEntity代码:
package com.frinder.entity; import net.logstash.logback.encoder.org.apache.commons.lang.builder.ReflectionToStringBuilder; /**
* Created by frinder on 2017/5/24.
*/
public class LoggerEntity { private String method;
private String uri;
private Object[] args;
private Object result;
private String operator;
private String appName; /**
* 获取当前对象
*
* @param method
* @param uri
* @param args
* @param result
* @return
*/
public LoggerEntity get(String method, String uri, Object[] args, Object result, String operator, String appName) {
setMethod(method);
setUri(uri);
setArgs(args);
setResult(result);
setOperator(operator);
setAppName(appName);
return this;
} public String getMethod() {
return method;
} public void setMethod(String method) {
this.method = method;
} public String getUri() {
return uri;
} public void setUri(String uri) {
this.uri = uri;
} public Object[] getArgs() {
return args;
} public void setArgs(Object[] args) {
this.args = args;
} public Object getResult() {
return result;
} public void setResult(Object result) {
this.result = result;
} public String getOperator() {
return operator;
} public void setOperator(String operator) {
this.operator = operator;
} public String getAppName() {
return appName;
} public void setAppName(String appName) {
this.appName = appName;
} @Override
public String toString() {
return ReflectionToStringBuilder.toString(this);
}
}
测试结果,需要在调试模式下才能看到:

JAVA“动态”为类添加属性的更多相关文章
- runTime动态给类添加属性
		
#项目中需要给系统类添加属性 #需要注意的地方就是.m中 set 和 get ,get方法中方法名和添加的属性名一致,set中可以用驼峰 #import <UIKit/UIKit.h> ...
 - runtime-给系统已有类添加属性
		
在没有接触runtime之前,我们接触到的能给类进行扩展的方法有类目(category)和延展(extension)两种.类目(category)可以给系统已有类添加扩展方法但是不能添加属性,并且被添 ...
 - Java 动态分页类
		
动态分页类: Cls_page.java package pagination; public class Cls_page { private int nums;// 总条目数 private i ...
 - python - 装饰器+描述符(给类添加属性且属性类型审核)
		
装饰器+描述符 实现给一个类添加属性且对添加的时,对属性进行类型审核: def zsq(**kwargs): def fun(obj): for i,j in kwargs.items(): seta ...
 - 初看Mybatis 源码 (二) Java动态代理类
		
先抛出一个问题,用过Mybatis的都知道,我们只需要定义一个Dao的接口,在里面写上一些CRUD相关操作,然后配置一下sql映射文件,就可以达到调用接口中的方法,然后执行sql语句的效果,为什么呢? ...
 - C#基础知识---动态为类型添加属性
		
一.概述 通常情况下,我们是事先在类型中定义好属性的,但有时候,我们需要动态为一个类型添加某些属性,这个时候,我们就需要使用DynamicObject类型了. 二.Demo using System; ...
 - Java动态生成类以及动态添加属性
		
有个技术实现需求:动态生成类,其中类中的属性来自参数对象中的全部属性以及来自参数对象properties文件. 那么技术实现支持:使用CGLib代理. 具体的实现步骤: 1.配置Maven文件: &l ...
 - RunTime 给类添加属性
		
RunTime网上有很多人都不知道Runtime到底是干嘛的?有很多博主都是长篇大论给他们讲这个讲那个,我感觉还不如实例来的实在.很简单的一个例子:我们都知道会有这样的需求,未读消息列表的图片上要有一 ...
 - 【原】如何获取Java动态生成类?
		
写作目的:Java大部分框架,如Spring,Hibernate等都会利用动态代理在程序运行的时候生成新的类, 有的时候为了学习,或者深入了解动态代理,想查看动态生成类的源代码究竟长怎么个样子, 通过 ...
 
随机推荐
- python引用,浅复制,深复制
			
引用:可以按照指针理解 copy:只复制父元素,所以如果一个列表嵌套了列表,那么浅复制后原变量和复制后的变量还是引用相同的子元素,子元素修改后,两个变量还会对应改变. deepcopy:复制父元素和子 ...
 - spring coud feign
			
1. 依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...
 - Overcoming Life's Obstacles - ASC 2017 March 03-04
			
<Overcoming Life's Obstacles - How a top oboist overcame a neurological disorder to play again> ...
 - (1)shiro简介和第一个demo
			
之前一直在用shiro开发,不过只是会使用,并没有深入了解,最近有时间学习了一下,把最近学习所得分享一下. shiro简介 Apache Shiro是一个强大且易用的Java安全框架,执行身份验证.授 ...
 - spring 3.x + hibernate4.x 实现数据延迟加载
			
Spring为我们解决Hibernate的Session的关闭与开启问题. Hibernate 允许对关联对象.属性进行延迟加载,但是必须保证延迟加载的操作限于同一个 Hibernate Sess ...
 - ID3、C4.5和cart算法比较(转)
			
转自:https://www.zhihu.com/question/27205203
 - CSS文字大小单位px、em、pt详解
			
这里引用的是Jorux的“95%的中国网站需要重写CSS”的文章,题目有点吓人,但是确实是现在国内网页制作方面的一些缺陷.我一直也搞不清楚px与em之间的关系和特点,看过以后确实收获很大.平时都是用p ...
 - android环境安装及配置
			
直接从网上下载适合当前系统的jdk(eclipse需要一个java虚拟器的环境) 直接从android上下载最新的adt-bundle-windows-x86(64)-xxxxxx.zip(集成好的e ...
 - 利用redis完成自动补全搜索功能(三)
			
前面已经完成了分词和自动提示功能,最后把搜索结合在一起,来个完成的案例.当然最好还是用搜索分词解决,这个只是一个临时解决方案. 其实加上搜索很简单,要做的就是3件事 1. 分词的时候,把有用词的id存 ...
 - gis笔记 wms wfs等OGC标准
			
WFS 和WMS的区别 WFS是基于地理要素级别的数据共享和数据操作,WFS规范定义了若干基于地理要素(Feature)级别的数据操作接口,并以 HTTP 作为分布式计算平台.通过 WFS服务,客户端 ...