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;
}
}
- Javassist 动态生成类
- javassist动态生成class
- javassist 动态生成WebService
- 使用javassist生成新类
- 使用javassist生成新类
- Javassist生成class(生成类,方法,字段,注解)
- JAVAssist---动态修改注解
- JAVAssist---动态修改注解
- Javassist实现动态代理
- 动态构造 Java 类的一种方法: javassist (1)
- 动态构造 Java 类的一种方法: javassist (2)
- 动态构造 Java 类的一种方法: javassist (3)
- 使用javassist框架进行动态的更改Class类
- java动态代理(类加载、asm、cglib、javassist)
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- 利用Java反射机制和Javassist实现Java对象及其属性的动态创建生成
- javassist生成的对象回收
- 使用javassist生成实体对象
- Split字符串作为分隔符
- js判断是否位数字
- WINCE控制面板项增减所在目录文件
- 死水
- Android---Gesture手势识别(一)
- Javassist 动态生成类
- php一个amp多个地址
- The operation couldn’t be completed. (LaunchServicesError error 0.)
- 解压和重新打包 apk 安装包流程记录
- iOS极光推送常见问题
- 原生态,图片逐渐显示html
- MMORPG游戏设计学习笔记·游戏体验评价指标(自用)
- spring mvc redirect传参数
- 在线状态