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;
}
}
依赖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;
}
}
相关文章推荐
- Java获取工程目录下图片资源
- 从”JAVA“而终 18:java Jdbc编程(ResultSet)集合讲解
- java JDK 动态代理(如何使用,以及工作原理解析)
- Stooge sort: Sorting by Exchanging
- 多态性
- java.lang.OutOfMemoryError: PermGen space及其解决方法
- java基本集成开发环境搭建
- java 验证手机号码、电话号码(包括最新的电信、联通和移动号码)
- 第7条:避免使用终结方法
- java两种方式遍历map
- 方法重载和重写
- spring tx:advice事务配置
- Java集合类框架
- Mongo整合SpringTemplate用法
- intellij 创建java web项目(maven管理的SSH)
- intellij 创建java web项目(maven管理的SSH)
- java根据表生成实体类
- Java分页代码
- Java的四种代码块
- Java学习笔记(十八)软件开发、Ant及重构