`
bao231
  • 浏览: 87460 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

cglib类动态代理

 
阅读更多


Enhancer enhancer = new Enhancer();

            enhancer.setSuperclass(moduleClass);

            DefaultInterceptor defaultCallback = new DefaultInterceptor();
            ModuleInterceptor  moduleCallback  = new ModuleInterceptor();

            enhancer.setCallbacks(new Callback[] { defaultCallback, moduleCallback });
            enhancer.setCallbackFilter(moduleCallback);

            module = (Module) enhancer.create();





  /**
     * 默认拦截器。
     */
    private class DefaultInterceptor implements MethodInterceptor {
        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
                throws Throwable {
            return proxy.invokeSuper(obj, args);
        }
    }

    /**
     * Module拦截器。
     */
    private class ModuleInterceptor implements MethodInterceptor, CallbackFilter {
        public int accept(Method method) {
            if (Modifier.isAbstract(method.getModifiers()) && method.getName().startsWith("get")
                        && (method.getName().length() > "get".length())
                        && (method.getParameterTypes().length == 0)
                        && !method.getReturnType().equals(Void.TYPE)) {
                return 1;
            }

            return 0;
        }

        public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy)
                throws Throwable {
            Object returnValue = null;
            String methodName  = method.getName();
            Class  returnType  = method.getReturnType();
            String objectName  = methodName.substring("get".length());

            if (Character.isUpperCase(objectName.charAt(0))) {
                objectName = Character.toLowerCase(objectName.charAt(0)) + objectName.substring(1);
            }

            returnValue = resolver.getObject(objectName, returnType);

            return returnValue;
        }
    }



分享到:
评论

相关推荐

    浅谈JDK动态代理与CGLIB代理去区别

    在Java开发中,动态代理和CGLIB代理是两种常见的面向切面编程(AOP)实现方式,它们都用于在不修改原有代码的情况下,增强或扩展对象的功能。本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中...

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

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

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

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

    cglib的动态代理需要的包

    在Java中,有两种常见的动态代理方式:Java内置的Java.lang.reflect.Proxy类和第三方库如CGlib。Java内置的Proxy类需要目标类实现至少一个接口,然后才能创建代理对象。然而,如果目标类没有实现任何接口,我们就不...

    Spring框架中JDK动态代理和cglib动态代理

    CGLIB 动态代理可以代理没有接口的类,這是因为 CGLIB 动态代理可以生成一个原类的子类,然后 override 原类的方法来实现代理。 在 Spring AOP 框架中,默认情况下,Spring 会选择使用 JDK 动态代理,但是如果目标...

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

    CGLIB通过字节码技术生成代理类,它在运行时动态地创建一个新的类,这个新类继承自目标类,并覆盖或增强目标类的方法。这样,我们就可以在代理类中添加AOP所需要的通知,从而实现切面的逻辑。 使用CGLIB进行动态...

    cglib实现动态代理依赖jar包

    总结来说,"cglib实现动态代理依赖jar包"中的asm-5.1.jar和cglib-3.2.4.jar是实现Java动态代理的重要工具,它们通过字节码技术实现了对类的无侵入式扩展和控制,是很多Java企业级框架的核心组成部分。

    cglib动态代理介绍

    CGlib则是Java动态代理的一种实现方式,尤其是在不提供接口的情况下,它通过生成目标类的子类来实现动态代理。 在Java中,JDK自带的动态代理机制是基于接口的,如果被代理的类没有实现任何接口,那么就无法使用JDK...

    AOP之JDK动态代理和CGLib动态代理

    CGLib通过生成目标对象的子类来实现代理,它会动态地创建一个新的类,这个类继承自目标类,并覆盖其方法以插入切面逻辑。CGLib的优点是它可以代理任何类,无需目标对象实现接口,但相比JDK动态代理,它的运行效率较...

    jdk动态代理 cglib3.0动态代理

    3. **字节码生成**:CGLIB使用ASM库(一个Java字节码操控和分析框架)来生成和修改类的字节码,从而实现对目标类的动态代理。 **比较与选择** JDK动态代理简单易用,但仅限于代理实现接口的类。如果需要代理的类...

    CGlib动态代理类的jar包

    CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...

    CGLIB 和 JDK生成动态代理类的区别

    性能方面,CGLIB通常比JDK动态代理更快,因为它是基于字节码生成的子类,而JDK动态代理需要创建接口的实现类。但是,如果目标类已经实现了接口,JDK动态代理的性能开销相对较小,因为它避免了子类继承带来的额外成本...

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

    - 如果目标类中包含静态方法,CGlib代理不会影响静态方法的行为。 总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者...

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

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

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

    - **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...

    cglib动态代理jar包

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

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码)

    java常用设计模式及JDK与CGLIB实现动态代理区别(源码) /** * 使用cglib动态代理 * @author * */ public class BookFacadeProxy implements MethodInterceptor{ private Object target; @Override public...

    Java动态代理详解; CGLib实现动态代理1

    动态代理提供了在运行时动态创建代理对象的能力,而 CGLib 使得代理机制可以应用于没有接口的类,提高了代码的灵活性和可扩展性。通过代理模式,我们可以将业务逻辑与辅助功能分离,让代码更加模块化,便于维护和...

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

    当JDK动态代理无法满足需求,例如代理的目标类没有实现接口时,CGLIB就能派上用场。CGLIB是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGLIB通过生成子类并在子类的方法上织入增强代码...

    输出JDK和CGLib动态代理产生的class文件.zip

    2. CGLib代理项目: - src/main/java:包含目标类 - target/classes:编译后的class文件,包括目标类的class文件,以及由CGLib生成的子类class文件 - 测试代码:展示如何使用Enhancer创建代理对象并调用方法 这...

Global site tag (gtag.js) - Google Analytics