`
cuiran
  • 浏览: 82258 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Cglib小样例

    博客分类:
  • java
阅读更多

一 介 绍

cglib是一个开源项目!

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

二 简单样例动态生成bean

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

需要导入cglib-nodep-2.2.jar

 

 

 对应的jar包,在附件中.

 

写道 先建一个bean

 

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

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

	public CglibBean() {
		super();
	}

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

	@SuppressWarnings("unchecked")
	private Object generateBean(Map<String,Class> 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<String, Class> propertyMap = new HashMap<String, Class>();

		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());
		}
	}
}

 结果是:

  >> id      = 123
  >> name    = 454
  >> address = 789
setId
getAddress
getName
getId
setName
setAddress

1
3
分享到:
评论

相关推荐

    java(cglib)动态代理样例

    CGlib(Code Generation Library)是Java中实现动态代理的一种常见方式,特别是在Java代理接口不适用或者目标类没有实现任何接口的情况下。 动态代理的主要应用场景包括日志记录、性能监控、事务管理、权限控制等。...

    cglib生成的代理class

    cglib生成的代理的class

    Spring AOP 工程样例

    2. **CGLIB代理(CGLIB)**:如果目标对象没有实现接口,Spring会使用CGLIB库生成目标对象的子类并进行增强。 **AOP配置** Spring AOP的配置可以通过XML或注解方式进行: 1. **XML配置**:在`&lt;aop:config&gt;`标签下...

    测试样例源码springlearn_20191229.zip

    《SpringBoot学习样例:@Cacheable应用与调试解析》 在编程领域,SpringBoot以其简洁的配置、强大的功能和良好的社区支持,成为了广大开发者构建Web应用的首选框架。而Spring框架中的缓存管理机制,如@Cacheable...

    Spring第七节课.pdf

    最后,本文通过代码样例讲解了AOP的术语和概念: - Aspect切面:通常指一个具有特定关注点的普通类。 - Pointcut切入点:用于指定在哪些类或方法上进行增强操作。 - Advice通知:定义在连接点上执行的动作,分为...

    Spring AOP DEMO

    JDK代理用于接口,而CGLIB代理用于没有接口或需要更细粒度控制的情况。 在DEMO中,你可能看到如下步骤: 1. 定义一个切面类,包含通知方法。 2. 使用@Aspect注解标记切面类。 3. 定义切点表达式,使用@Pointcut注解...

    spring aop

    1. **代理模式**:Spring AOP通过两种代理模式实现,即JDK动态代理和CGLIB代理。如果目标类实现了接口,Spring将使用JDK动态代理;否则,使用CGLIB生成目标类的子类。 2. **注解驱动**:Spring AOP支持使用注解来...

    springboot多数据源整合

    Spring Boot默认会为`@Transactional`注解启用CGLIB代理,但如果涉及切面(AspectJ)事务管理,可能需要开启AspectJ的编译时或运行时织入。 6. **代码示例**:在提供的压缩包中,可能包含了一个运行的样例项目,...

    factory-bean-demo.7z

    2. **代理对象**: 比如AOP代理,Spring默认提供了JDK动态代理和CGLIB代理,但如果有特定需求,可以自定义`FactoryBean`生成代理对象。 3. **接口的实现**: 如果希望为某个接口提供多种实现,可以通过`FactoryBean`...

    spring框架配置bean的高级属性

    接下来,我们将对描述中给出的样例配置文件进行逐行解析。 ```xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=...

    Spring 2.0 开发参考手册

    2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 ...

    spring chm文档

    2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入依赖 ...

    Spring中文帮助文档

    2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入...

    Spring API

    2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. IoC(控制反转)容器 3.1. 简介 3.2. 基本原理 - 容器和bean 3.2.1. 容器 3.2.2. 实例化容器 3.2.3. 多种bean 3.2.4. 使用容器 3.3. 依赖 3.3.1. 注入...

    Spring-Reference_zh_CN(Spring中文参考手册)

    2.8. 更新的样例应用 2.9. 改进的文档 I. 核心技术 3. 控制反转容器 3.1. 简介 3.2. 容器和bean的基本原理 3.2.1. 容器 3.2.1.1. 配置元数据 3.2.2. 实例化容器 3.2.2.1. 组成基于XML配置元数据 3.2.3. 多种bean 3.2...

Global site tag (gtag.js) - Google Analytics