cglib动态新增类方法

<dependency>
            <groupId>cglib</groupId>
            <artifactId>cglib</artifactId>
            <version>3.2.4</version>
        </dependency>

import java.io.Serializable;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Date;

import net.sf.cglib.core.Signature;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.InterfaceMaker;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import org.objectweb.asm.Type;

public class CGLibExample {  

    @SuppressWarnings("rawtypes")
    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() {
            @Override
            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[]{"20160531"});
        } 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;
    }
}
时间: 2024-10-24 22:34:05

cglib动态新增类方法的相关文章

CGLib动态代理原理及实现

JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑.JDK动态代理与CGLib动态代理均是实现Spring AOP的基础. 简单的实现举例: 这是一个需要被代理的类,也就是父类,通过字节码技术创建这个类的子类,实现动态代理. [java] view plain copy public clas

Spring AOP详解 、 JDK动态代理、CGLib动态代理

AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就成为“连接点”,Spring仅支持方法的连接点,即

关于JDK动态代理和CGLIB动态代理

1. 代理模式 一句话总结:为其他对象提供一种代理以控制对这个对象的访问.千篇一律的介绍:代理模式是常用的java设计模式,他的特征是代理类与委托类(或目标类)有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工具

JDK动态代理与CGLIB动态代理区别

JDK动态代理 只能代理实现了接口的类 没有实现接口的类不能实现JDK的动态代理 CGLIB动态代理 针对类来实现代理的 对指定目标类产生一个子类,通过方法拦击技术拦截所有父类方法的调用 使用Cglib实现动态代理 package com.imooc.cglib; public class Train {  public void move(){   System.out.println("火车行驶中");  } } import java.lang.reflect.Method; i

[z]Java代理(jdk静态代理、动态代理和cglib动态代理)

一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 1 2 3 4 5 6 7 8 9 10 11 12 13 /**  * 业务接口  * @author pc  *  */ public interface UserService {          // 增加一个用户     public void addUser();     // 编辑账户     pub

Java代理(jdk静态代理、动态代理和cglib动态代理)

一.代理是Java常用的设计模式,代理类通过调用被代理类的相关方法,并对相关方法进行增强.加入一些非业务性代码,比如事务.日志.报警发邮件等操作. 二.jdk静态代理 1.业务接口 /** * 业务接口 * @author pc * */ public interface UserService { // 增加一个用户 public void addUser(); // 编辑账户 public void editUser(); } 2.业务实现类 /** * 业务实现类 * @author pc

【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理

原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspect Oriented Programing的简称,面向切面编程.AOP适合于那些具有横切逻辑的应用:如性能监测,访问控制,事务管理以及日志记录.AOP将这些分散在各个业务逻辑中的代码通过横向切割的方式抽取到一个独立的模块中. 一.AOP术语 1.连接点(Joinpoint) 程序执行的某个特定位置:如类开始初始化之前.类初始化之后.类某个方法调用前.调用后等:一个类

JDK动态OA信用盘平台出租代理和cglib动态代理

一.代理设计模式OA信用盘平台出租haozbbs.com Q1446595067 代理类和委托类具有相同的接口.代理类的对象本身并不真正实现服务,而是通过委托类的对象的相关方法来提供特定的服务. 二.静态代理 见<大话设计模式>第7章 缺点: 一个代理类只能应用于一个接口的实现类,如果有多个接口的话就要定义很多实现类和代理类才行.而且,如果代理类对业务方法的预处理.调用后操作都是一样的(比如:调用前输出提示.调用后自动关闭连接),则多个代理类就会有很多的重复代码.这时我们可以定义这样一个代理类

spring aop原理 JDK动态代理和CGLIB动态代理

Spring的两大特性是IOC和AOPIOC负责将对象动态的注入到容器,从而达到一种需要谁就注入谁,什么时候需要就什么时候注入的效果.理解spring的ioc也很重要.但是今天主要来和大家讲讲aop.AOP 广泛应用于处理一些具有横切性质的系统级服务,AOP 的出现是对 OOP 的良好补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等等. AOP实现的关键在于AOP框架自动创建的AOP代理.AOP代理主要分为静态代理和动态代理, 静态代理的代表为AspectJ:动态代理则