【博文總目錄>>>】|【項目源碼>>>】
CGLIB是一個強大的、高效能的代碼產生庫。其被廣泛應用於AOP架構(Spring、dynaop)中,用以提供方法攔截操作。本樣本展示了如何使用cglib動態產生類。
package wjc.cglib;import net.sf.cglib.beans.BeanGenerator;import net.sf.cglib.beans.BeanMap;import java.util.Map;/** * <pre> * 建立一個動態實體bean,使用cglib動態加入屬性,和相應的get,set方法 * </pre> * Author: 王俊超 * Date: 2018-02-22 09:18 * Blog: http://blog.csdn.net/derrantcm * Github: https://github.com/wang-jun-chao * All Rights Reserved !!! */public class CglibBean { /** * 實體Object */ private Object object = null; /** * 屬性map */ private BeanMap beanMap = null; public CglibBean() { super(); } public CglibBean(Map<String, Class<?>> propertyMap) { this.object = generateBean(propertyMap); this.beanMap = BeanMap.create(this.object); } /** * 給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); } /** * 得到該實體bean對象 * * @return */ public Object getObject() { return this.object; } private Object generateBean(Map<String, Class<?>> propertyMap) { if (propertyMap == null || propertyMap.isEmpty()) { return null; } BeanGenerator generator = new BeanGenerator(); for (Map.Entry<String, Class<?>> entry : propertyMap.entrySet()) { generator.addProperty(entry.getKey(), entry.getValue()); } return generator.create(); }}
package wjc.cglib;import java.lang.reflect.Method;import java.util.HashMap;import java.util.Map;/** * <pre> * CGLIB是一個強大的、高效能的代碼產生庫。其被廣泛應用於AOP架構(Spring、dynaop)中,用以提供方法攔截操作。 * </pre> * Author: 王俊超 * Date: 2018-02-22 09:26 * Blog: http://blog.csdn.net/derrantcm * Github: https://github.com/wang-jun-chao * All Rights Reserved !!! */public class ClassGeneration { public static void main(String[] args) throws ClassNotFoundException { // 設定類成員屬性 Map<String, Class<?>> propertyMap = new HashMap<>(); propertyMap.put("id", Class.forName("java.lang.Integer")); propertyMap.put("name", Class.forName("java.lang.String")); propertyMap.put("address", Class.forName("java.lang.String")); // 產生動態 Bean CglibBean bean = new CglibBean(propertyMap); // 給 Bean 設定值 bean.setValue("id", 123); bean.setValue("name", "454"); bean.setValue("address", "789"); // 從 Bean 中擷取值,當然了獲得值的類型是 Object System.out.println("id = " + bean.getValue("id")); System.out.println("name = " + bean.getValue("name")); System.out.println("address = " + bean.getValue("address")); // 獲得bean的實體 Object object = bean.getObject(); Class clazz = object.getClass(); // 查看產生的類名 System.out.println(clazz.getName()); // 通過反射查看所有方法名 Method[] methods = clazz.getDeclaredMethods(); for (Method method : methods) { System.out.println(method.getName()); } }}
運行結果