`
ckwang17
  • 浏览: 26266 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

使用cglib动态创建java类

阅读更多

cglib

是一个开源项目!

是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。许多开源项目都用到了它,如HibernateSpring之类用它来实现动态代理。

 简单样例动态生成bean

  样例说明:建立一个动态实体bean,使用cglib动态加入属性,和相应的getset方法。

需要导入cglib-nodep-2.2.jar

been类

public class CglibBean {
/**
  * 实体Object
  */
public Object object = null;

/**
  * 属性map
  */
public BeanMap beanMap = null;

public CglibBean() {
  super();
}

@SuppressWarnings("unchecked")
public CglibBean(Map 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;
}

@SuppressWarnings("unchecked")
private Object generateBean(Map propertyMap) {
  BeanGenerator generator = new BeanGenerator();
  Set keySet = propertyMap.keySet();
  for (Iterator i = keySet.iterator(); i.hasNext();) {
   String key = (String) i.next();
   generator.addProperty(key, (Class) propertyMap.get(key));
  }
  return generator.create();
}
}

 

 

 

 

再写一个测试类

package com.infotech.cglibTest;

import java.lang.reflect.Method;
import java.util.HashMap;

/**
 * Cglib测试类
 * @author cuiran
 * @version 1.0
 */
public class CglibTest {
	
	
	
	@SuppressWarnings("unchecked")
	public static void main(String[] args) throws ClassNotFoundException {

		// 设置类成员属性
		HashMap 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", new Integer(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();
		Method[] methods = clazz.getDeclaredMethods();
		for (int i = 0; i < methods.length; i++) {
			System.out.println(methods[i].getName());
		}
	}

  

分享到:
评论
2 楼 tarena_hhh 2015-03-18  
tarena_hhh 写道
我想最后
做转json操作

JSONObject a = JSONObject.fromObject(clazz);

请问还怎么做。

我sb了。
public static void main(String[] args) throws ClassNotFoundException {
// 设置类成员属性
HashMap 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", new Integer(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();
JSONObject obj = JSONObject.fromObject(object);
System.out.println(obj);

}
1 楼 tarena_hhh 2015-03-18  
我想最后
做转json操作

JSONObject a = JSONObject.fromObject(clazz);

请问还怎么做。

相关推荐

    cglib动态生成java类

    3. **动态数据访问**:例如ORM框架如Hibernate,使用CGLib动态创建数据访问对象(DAO)。 总的来说,CGLib是Java开发中一个不可或缺的工具,尤其在需要动态生成和修改类的场景下,它的高效和灵活使其成为首选。了解...

    cglib动态代理

    CGLib动态代理是一种在Java编程中实现动态代理的技术,它主要通过字节码操作库ASM来生成目标类的子类,从而实现对目标类的方法拦截和增强。在Java中,当我们需要在运行时动态地创建对象并扩展其功能时,CGLib是一个...

    cglib动态代理jar包

    CGlib动态代理是Java开发中一个非常重要的工具库,它主要用来实现代理模式,尤其在面向切面编程(AOP)中发挥着关键作用。CGlib是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGlib并不...

    cglib动态代理介绍

    CGlib的核心类是`Enhancer`,它是CGlib动态代理的入口。我们可以通过`Enhancer`创建一个增强器实例,然后设置回调函数(Callback),最后通过`enhancer.create()`方法生成代理对象。回调函数通常是`...

    cglib创建代理类.rar

    springAOP等框架中,大量用到代理技术; 两类代理技术: 1,java动态代理,见JDK文档或相关java书;...2.cglib创建代理类,比第一种更加简单,代理类和背代理类不需要实现共同接口。本例子就是cglib代理的例子,很简单

    CGlib动态代理类所需的jar包

    CGlib(Code Generation Library)是Java编程语言中的一个代码生成库,主要用于运行时动态创建对象和扩展类。在Java世界中,动态代理是一种强大的技术,它允许我们在运行时创建对象并实现特定接口或覆盖特定方法。...

    Jdk动态代理和cglib动态代理原理

    在实际开发中,如Spring AOP框架就同时支持JDK和CGLIB动态代理,根据目标类是否实现接口自动选择合适的代理方式。 总结来说,JDK动态代理和CGLIB动态代理都是为了在运行时提供对目标对象的增强,它们通过不同的实现...

    CGlib动态代理类的jar包

    使用CGlib动态代理的一般步骤如下: 1. 引入相关依赖:在项目中引入上述jar包。 2. 创建Enhancer对象:`Enhancer enhancer = new Enhancer();` 3. 设置被代理的目标类:`enhancer.setSuperclass(MyTargetClass.class...

    cglib动态代理用到的两个包

    它是一个强大的工具,广泛用于创建Java代理、AOP(面向切面编程)框架以及代码生成场景。CGLib依赖于ASM库来实现其底层功能,ASM是一个Java字节码操控和分析框架。 在CGLib动态代理机制中,主要有两个核心包: 1. ...

    cglib动态代理相关包

    它是对Bytecode Generation Library(字节码生成库)的一个封装,能够在运行时动态创建新类和对象,广泛应用于AOP(面向切面编程)框架如Spring中。 **CGlib动态代理原理** CGlib动态代理基于ASM库来操作Java字节码...

    转载:cglib动态代理介绍(一)

    这个库在很多场合被广泛使用,特别是在那些需要在运行时动态创建对象或增强已有对象功能的场景下,比如Spring AOP(面向切面编程)就是其中的一个典型应用。下面我们将深入探讨CGlib动态代理的相关知识点。 ### ...

    cglib及其依赖包

    当一个类没有实现接口时,Spring将使用CGLib动态生成该类的子类,并在子类中插入切面代码。这样,每次调用原始类的方法时,都会先执行切面代码,然后再执行原方法,从而实现了切面编程。 总的来说,CGLib和ASM库的...

    cglib完美支持java17及以上

    然而,CGlib也有其局限性,比如对于final类和方法,由于Java的限制,CGlib无法创建子类,因此不能对其进行扩展。此外,对于大型项目,由于其底层的字节码操作,调试可能会变得更加复杂。 在实际应用中,CGlib通常与...

    CgLib动态代理所需的jar

    使用CgLib动态代理的步骤大致如下: 1. 创建Enhancer对象:这是CgLib的核心类,用于配置代理对象的创建过程。 2. 设置回调函数:通常使用MethodInterceptor接口,定义intercept()方法,这是代理方法执行前后的回调...

    jdk与cglib动态代理与底层实现

    在Java编程领域,代理模式...了解并掌握JDK和CGLIB动态代理的原理及使用,对于深入理解Spring框架和提升Java开发能力至关重要。通过实践案例,你可以进一步探索这两个代理机制的实现细节,从而更好地应用在实际项目中。

    基于MAVEN项目的CGLib动态代理原理及实现

    总结,CGLib动态代理在基于Maven的项目中有着广泛的应用,它提供了对未实现接口的类进行扩展的能力。通过理解其工作原理和使用方式,开发者可以更灵活地实现诸如日志记录、性能监控、事务管理等增强功能。结合实际...

    java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】

    java设计模式【之】Cglib动态代理【源码】【场景:帮爸爸买菜】 /** * 代理模式 * 在开发者的角度来看,创建一个代理对象,提供给用户使用,避免用户直接访问真正的对象 * 在用户角度来看,就是普通的类方法调用...

    java代理机制 JDK动态代理和cglib代理 详解

    CGLIB使用ASM库在运行时动态生成字节码,创建目标类的子类,从而实现对目标类方法的增强。 1. **Enhancer类** - `Enhancer`是CGLIB的主要入口,它扮演了工厂的角色,通过它可以配置代理对象的行为,并生成代理子类...

    java动态代理和cglib动态代理示例分享共5页.pdf

    Java动态代理和CGLIB动态代理是两种在Java开发中常用的面向切面编程(AOP)技术,主要用于在运行时创建具有额外功能的对象。这两者都允许我们在不修改原有代码的情况下,为对象添加额外的行为,如日志记录、事务管理...

    java cglib和反射demo

    CGLib全称为Code Generation Library,是一个Java字节码操纵库,主要用于为类创建子类,从而实现动态代理。当目标类无法被继承(如final类)或者不希望修改源代码时,CGLib是一个很好的选择。它通过动态生成字节码...

Global site tag (gtag.js) - Google Analytics