您的位置:首页 > 编程语言 > Java开发

Javassist 动态生成类

2015-11-12 11:46 447 查看
Javassist是一个开源的分析、编辑和创建Java字节码的类库。

依赖jar包 javassist-3.15.0-GA.jar

package com.dataeye.utils;

import java.lang.reflect.Field;

import java.util.Iterator;

import java.util.Map;

import javassist.CannotCompileException;

import javassist.ClassPool;

import javassist.CtClass;

import javassist.CtField;

import javassist.Loader;

import javassist.Modifier;

import javassist.NotFoundException;

/**

 * 使用 Javassist 动态生成类,也就是创建一个新类。

 * 

 * @author chenfanglin

 * @date 2015年8月3日

 */

public class DynamicCreateObjectUtil {

/**
* 动态创建一个类

* @param className
*            需要创建的java类的名称

* @param fieldMap
*            字段-字段值的属性map,需要添加的属性

* @return

* @throws NotFoundException

* @throws CannotCompileException
* @throws ClassNotFoundException
*/
public static Class createClass(String className,
Map<String, Object> fieldMap) throws NotFoundException,
CannotCompileException, IllegalAccessException,
InstantiationException, ClassNotFoundException {

ClassPool pool = ClassPool.getDefault();// 获取javassist类池
Loader loader = new Loader(pool);
if (pool.getOrNull(className) != null) {
CtClass clas = pool.get(className);
if (clas.isFrozen()) {
// 从pool中拆离这个类
clas.detach();
}
}
CtClass ctClass = pool.makeClass(className);// 创建javassist类
// 为创建的类ctClass添加属性

Iterator it = fieldMap.entrySet().iterator();

while (it.hasNext()) { // 遍历所有的属性

Map.Entry entry = (Map.Entry) it.next();

String fieldName = (String) entry.getKey();

Object fieldValue = entry.getValue();

// 增加属性,这里仅仅是增加属性字段

String fieldType = fieldValue.getClass().getName();

CtField ctField = new CtField(pool.get(fieldType), fieldName,
ctClass);

ctField.setModifiers(Modifier.PUBLIC);

ctClass.addField(ctField);

}
Class c = loader.loadClass(className);
return c;

}

/**
* 给对象属性赋值

* @throws IllegalAccessException
* @throws InstantiationException
* @throws CannotCompileException
*/
public static Object setObjectValue(Class c, Map<String, Object> fieldMap)
throws InstantiationException, IllegalAccessException,
CannotCompileException {
Object newObject = c.newInstance();// 为创建java对象
// 为创建的类newObject属性赋值
Iterator it = fieldMap.entrySet().iterator();
it = fieldMap.entrySet().iterator();

while (it.hasNext()) { // 遍历所有的属性

Map.Entry entry = (Map.Entry) it.next();

String fieldName = (String) entry.getKey();

Object fieldValue = entry.getValue();

// 为属性赋值

setFieldValue(newObject, fieldName, fieldValue);

}

return newObject;
}

/**

* 获取对象属性赋值

* @param dObject

* @param fieldName
*            字段别名

* @return
*/

public static Object getFieldValue(Object dObject, String fieldName) {

Object result = null;

try {

Field fu = dObject.getClass().getDeclaredField(fieldName); // 获取对象的属性域

try {

fu.setAccessible(true); // 设置对象属性域的访问属性

result = fu.get(dObject); // 获取对象属性域的属性值

} catch (IllegalAccessException e) {

e.printStackTrace();

}

} catch (NoSuchFieldException e) {

e.printStackTrace();

}

return result;

}

/**

* 给对象属性赋值

* @param dObject

* @param fieldName

* @param val

* @return
*/

public static Object setFieldValue(Object dObject, String fieldName,
Object val) {

Object result = null;

try {

Field fu = dObject.getClass().getDeclaredField(fieldName); // 获取对象的属性域

try {

fu.setAccessible(true); // 设置对象属性域的访问属性

fu.set(dObject, val); // 设置对象属性域的属性值

result = fu.get(dObject); // 获取对象属性域的属性值

} catch (IllegalAccessException e) {

e.printStackTrace();

}

} catch (NoSuchFieldException e) {

e.printStackTrace();

}

return result;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: