`
rensanning
  • 浏览: 3549333 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38167
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607357
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682396
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89396
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401877
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69710
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91733
社区版块
存档分类
最新评论

使用cglib动态为Java类添加方法

    博客分类:
  • Java
 
阅读更多
CGLib(Code Generation Library)是一个强大的,高性能,高质量的字节码操作类库,它可以在运行期扩展Java类与实现Java接口,Spring、Hibernate等很多著名的框架都使用了它。
https://github.com/cglib/cglib/

其他的库还有:
Javassist (Java Programming Assistant)ASMApache Commons BCEL(Byte Code Engineering Library)

public class CGLibExample {

    @SuppressWarnings("unchecked")
    public static void main(String[] args) {
    	
    	// 定义一个参数是字符串类型的setCreatedAt方法
        InterfaceMaker im = new InterfaceMaker();
        im.add(new Signature("setCreatedAt", Type.VOID_TYPE, 
        		new Type[] { Type.getType(String.class) }), null);

        Class myInterface = im.create();

        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(ExampleBean.class);
        enhancer.setInterfaces(new Class[] { myInterface });
        enhancer.setCallback(new MethodInterceptor() {
            public Object intercept(Object obj, Method method, Object[] args,
                    MethodProxy proxy) throws Throwable {
                
                ExampleBean bean = (ExampleBean) obj;
                
                // 调用字符串类型的setCreatedAt方法时,转换成Date型后调用Setter
                if (method.getName().startsWith("setCreatedAt")
                        && args[0] != null && args[0] instanceof String) {

                    SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
                    Date date = null;
                    try {
                        date = sdf.parse((String) args[0]);
                    } catch (final Exception e) { /* nop */ }
                    bean.setCreatedAt(date);
                    return null;

                }
                return proxy.invokeSuper(obj, args);
            }
        });

        // 生成一个Bean
        ExampleBean bean = (ExampleBean) enhancer.create();
        bean.setId(999);

        try {
            Method method = bean.getClass().getMethod("setCreatedAt", new Class[] {String.class});
            method.invoke(bean, new Object[]{"20100531"});
        } catch (final Exception e) {
            e.printStackTrace();
        }
        
        System.out.printf("id : [%d] createdAt : [%s]\n", bean.getId(), bean.getCreatedAt());
    }
}

class ExampleBean implements Serializable {
    private static final long serialVersionUID = -8121418052209958014L;
    
    private int id;
    private Date createdAt;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(Date createdAt) {
        this.createdAt = createdAt;
    }
}


运行结果:

引用
id : [999] createdAt : [Mon May 31 00:00:00 CST 2010]

分享到:
评论

相关推荐

    cglib动态代理

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

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

    接着,创建一个实现了`InvocationHandler`接口的类,重写`invoke()`方法,在其中添加额外的行为。最后,使用`Proxy.newProxyInstance()`创建代理对象,并通过代理对象调用方法。 ### CGLIB动态代理 CGLIB(Code ...

    cglib动态代理jar包

    当目标类不支持接口时,CGlib可以创建目标类的子类,并在子类中拦截方法调用,从而实现动态代理。具体步骤如下: 1. 创建Enhancer对象:这是CGlib的核心类,它可以配置代理的创建过程,包括设置回调函数、代理类名...

    cglib动态代理相关包

    CGlib是Java编程语言中的一个库,主要用于生成子类,以提供方法拦截和动态代理功能。它是对Bytecode Generation Library(字节码生成库)的一个封装,能够在运行时动态创建新类和对象,广泛应用于AOP(面向切面编程...

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

    总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者的重要助手。理解并熟练掌握CGlib的使用,能极大地提升开发效率和...

    Java 动态代理和Cglib代理(二)

    在Java编程领域,动态代理和Cglib代理是两种常用的技术,用于在运行时创建对象的代理,以实现额外的功能,如AOP(面向切面编程)中的日志、事务管理等。本篇文章将深入探讨这两种代理机制,尤其是Cglib代理。 首先...

    CGlib动态代理类所需的jar包

    这种方法比使用Java的标准动态代理(java.lang.reflect.Proxy)更为灵活,因为Java的代理只能应用于实现了接口的类。 **主要使用场景**: 1. **AOP编程**: 在Spring框架中,如果目标类没有实现接口,Spring就会使用...

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

    CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置 首先,我们需要在Maven项目的`pom.xml`文件中添加CGLib的依赖。在...

    动态代理和cglib例子

    - 接下来,通过java.lang.reflect.Proxy类的newProxyInstance()方法,传入接口、实现类的类加载器以及自定义的InvocationHandler实现,生成动态代理对象。 - 最后,通过代理对象调用接口方法,实际上会触发...

    cglib完美支持java17及以上

    它主要为Java应用程序提供一种方式来动态地生成子类,从而扩展已有类的功能或为已有的类添加新的行为。CGlib是许多其他流行框架,如Spring AOP和Hibernate,背后的重要技术之一。 在Java 17及更高版本中,CGlib继续...

    CgLib动态代理所需的jar

    CgLib是一个强大的Java字节码库,它允许开发者在运行时动态地创建新的类或增强现有的类。在Java世界中,动态代理是一种常见的编程模式,用于在运行时创建对象的代理,以便在调用真实对象的方法之前或之后执行额外的...

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

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

    CGlib实现动态代理(承接上面JDK实现动态代理)

    CGlib是Java编程语言中的一个库,主要用于生成子类,以此实现对现有类的动态代理。它是基于ASM库,能够直接操作字节码,从而在运行时创建新类的实例。在Java中,CGlib是一个非常重要的工具,特别是在AOP(面向切面...

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    动态代理主要用于创建一个代理对象,这个代理对象可以代替原始目标对象执行方法,并在调用前后添加额外的操作。例如,日志记录、性能监控等。InvocationHandler接口定义了一个方法`invoke()`,它在代理对象调用任何...

    Java动态代理(JDK和cglib)

    ### Java动态代理(JDK和cglib) #### 一、代理模式概述 代理模式是一种结构型设计模式,其中代理类含有一个对真实主题对象的引用,这样代理对象就可以执行一些预备或清理工作,并将真正的调用传递给真实主题对象...

    Cglib动态代理需要用到的jar包

    Cglib动态代理是Java开发中常用的一种技术,它允许我们为现有的类创建子类,并在子类中拦截方法调用。Cglib库通常与Spring框架一起使用,用于实现AOP(面向切面编程)的功能,如事务管理、日志记录等。在这个场景下...

    CGLIB动态代理jar包

    在Java开发中,CGLIB经常被用作AOP(面向切面编程)的底层实现,例如Spring框架就使用了CGLIB来实现对目标类的动态代理。 CGLIB是通过字节码技术来实现动态代理的。当我们的应用程序需要动态地创建一个类的实例或者...

    java动态代理实例(jdk动态代理和cglib)

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建对象的代理,从而可以在调用实际方法之前和之后添加额外的行为。本篇将深入探讨两种主要的Java动态代理技术:JDK动态代理和CGLIB。 首先,我们来...

    使用cglib演示动态代理时用到的jar包 aop 动态代理

    在Java中,通过动态代理可以实现在运行时为对象添加新的行为,而无需修改原始代码。 动态代理有两种主要实现方式:JDK动态代理和CGLIB动态代理。JDK动态代理基于接口,如果目标类实现了至少一个接口,就可以使用JDK...

Global site tag (gtag.js) - Google Analytics