Javassist 动态生成类

来源:互联网 发布:中国书画网络电视台 编辑:程序博客网 时间:2024/05/16 05:53

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;


}


}

0 0
原创粉丝点击