`
113.com
  • 浏览: 81136 次
  • 来自: 广州
社区版块
存档分类
最新评论

动态代理CglibProxy

    博客分类:
  • java
 
阅读更多
package org.apache.cxf.common.util;

import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.List;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;


/**
 * 
 */
class CglibProxyHelper extends ProxyHelper {
    CglibProxyHelper() throws Exception {
        Class.forName("net.sf.cglib.proxy.Enhancer");
        Class.forName("net.sf.cglib.proxy.MethodInterceptor");
        Class.forName("net.sf.cglib.proxy.MethodProxy");
    }
    
    @Override
    protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces, 
                                      final java.lang.reflect.InvocationHandler h) {
        
        Class<?> superClass = null;
        List<Class<?>> theInterfaces = new ArrayList<Class<?>>();
        
        for (Class<?> c : interfaces) {
            if (!c.isInterface()) {
                if (superClass != null) {
                    throw new IllegalArgumentException("Only a single superclass is supported");
                }
                superClass = c; 
            } else {
                theInterfaces.add(c);
            }
        }
        if (superClass != null) {
            Enhancer enhancer = new Enhancer();
            enhancer.setClassLoader(loader);
            enhancer.setSuperclass(superClass);
            enhancer.setInterfaces(theInterfaces.toArray(new Class[]{}));
            enhancer.setCallback(new MethodInterceptor() {

                public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) 
                    throws Throwable {
                    return h.invoke(obj, method, args);
                }
                
            });
            return enhancer.create();
        } else {
            return super.getProxyInternal(loader, interfaces, h);
        }
    }
    
    
}

 

 

package org.apache.cxf.common.util;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * 
 */
public class ProxyHelper {
    static final ProxyHelper HELPER;
    static {
        ProxyHelper theHelper = null;
        try {
            theHelper = new CglibProxyHelper();
        } catch (Throwable ex) {
            theHelper = new ProxyHelper();
        }
        HELPER = theHelper;
    }
    
    
    protected ProxyHelper() {
    }
    
    protected Object getProxyInternal(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) {
        return Proxy.newProxyInstance(loader, interfaces, handler);
    }
    
    
    public static Object getProxy(ClassLoader loader, Class<?>[] interfaces, InvocationHandler handler) {
        return HELPER.getProxyInternal(loader, interfaces, handler);
    }
}

 

分享到:
评论

相关推荐

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,我们可以使用两种方式实现动态代理:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。Java的`java.lang.reflect.Proxy`类和...

    Android-Android中动态代理的使用

    在Android开发中,动态代理(Dynamic Proxy)是一种强大的设计模式,它允许我们在运行时创建具有相同接口的新对象,这些新对象的行为与原始对象相同,但可以添加额外的功能或修改其行为。动态代理主要由Java标准库中...

    cglib(动态代理)

    CGLib,全称为Code Generation Library,是一个强大的高性能的代码生成库,它在Java世界中被广泛应用,尤其是在动态代理和AOP(面向切面编程)领域。CGLIB是由Evan Schooler创建的一个开源项目,目前已被Apache软件...

    Java 动态代理.md

    ### Java 动态代理 Java 动态代理是一种在运行时动态创建代理对象的技术,它在 Java 开发中被广泛应用,特别是在诸如 AOP(面向切面编程)的实现原理、RPC 远程调用、Java 注解对象获取、日志框架、全局性异常处理...

    JAVA JDK静态代理、动态代理、CGlib代理的代码演示

    Java提供了两种主要的代理实现方式:JDK静态代理和动态代理,另外还有第三方库如CGlib提供的代理实现。下面我们将详细探讨这些代理技术,并通过代码演示来理解它们的工作原理。 ### 1. JDK静态代理 静态代理是我们...

    示例代码:java动态代理和cglib代理的简单例子

    Java动态代理和CGLIB代理是两种常用的在Java中实现面向切面编程(AOP)的技术,它们允许我们在不修改原有代码的情况下,为方法添加额外的功能,如日志记录、性能监控、事务管理等。本篇文章将深入探讨这两种代理机制...

    CglibProxy

    CGLIB被广泛应用于许多AOP(面向切面编程)框架,如Spring AOP,作为动态代理的实现之一。CGLIB通过字节码技术生成代理对象,对目标类进行方法拦截,从而实现代理功能。 CGLIB的原理主要是通过ASM库来操作字节码,...

    java动态代理(JDK和cglib)共10页.pdf.z

    Java动态代理是Java编程中一个重要的特性,它允许我们在运行时创建代理类,这些代理类可以作为原有类的代理,实现在调用原有方法前后添加额外的功能,如日志记录、事务管理、性能监控等。Java提供了两种主要的动态...

    JAVA动态代理

    ### CGLib动态代理(CGLibProxy) CGLib(Code Generation Library)是另一个常用的动态代理库,它通过字节码技术生成目标对象的子类来实现代理。与JDK动态代理相比,CGLib不需要目标对象实现任何接口,可以对类...

    java中的三种代理模式

    JDK动态代理基于Java反射API,可以在运行时动态地生成代理类和实例。它需要目标对象实现至少一个接口,然后通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来创建代理对象。...

    16-Java代理模式的学习笔记1

    Java提供了两种主要的代理实现方式:静态代理和动态代理。 ### 静态代理 在静态代理中,我们需要为原始对象创建一个显式的代理类。代理类实现了与原始对象相同的接口,并在调用实际方法之前或之后添加额外的行为。...

    java 代理demo

    在Java中,代理主要有两种实现方式:静态代理和动态代理。 ### 静态代理 静态代理是最基础的形式,它需要我们手动创建一个代理类来实现与目标类相同的接口。代理类通常会持有目标类的引用,并在调用目标类的方法...

    Java代理示例代码

    在Java中,代理模式有两种主要实现方式:静态代理和动态代理。 **静态代理** 在静态代理中,我们需要手动创建一个代理类,该类实现与原始类相同的接口,并在其方法中调用原始对象的方法。例如,假设我们有一个`...

    Java代理实战Demo

    Java提供了两种主要的代理实现方式:CGLIB代理和JDK动态代理。 **JDK动态代理**: JDK动态代理主要依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。Proxy类用于创建一个代理对象,...

    代理模式(Proxy Pattern)完整示例代码

    Java提供了两种动态代理实现:JDK动态代理和CGLIB动态代理。 - **JDK动态代理**:基于接口实现,适用于目标对象实现了某个接口的情况。通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`...

    设计模式-代理模式-java

    在Java中,代理模式可以通过多种方式实现,包括静态代理、动态代理(JDK动态代理和CGLIB动态代理)等。 **静态代理** 静态代理是最基础的代理形式,需要手动创建一个代理类,该类继承或实现与目标类相同的接口,并...

    spring03-5

    在Spring框架中,CGLIB(Code Generation Library)代理是一种常用的动态代理机制,它允许我们对目标对象进行增强,即在不修改源代码的情况下,在运行时为类创建子类并添加额外的功能。CGLIB代理在Spring AOP(面向...

    简单实现Cglib子类代理

    Cglib子类代理是Java动态代理的一种实现方式,它主要通过字节码技术在运行时动态创建一个目标对象的子类,以此来实现代理功能。Cglib是一个强大的高性能的代码生成库,它在许多AOP(面向切面编程)框架中被广泛应用...

    cglib-3.2.4.jar

    《深入理解CGlib:Java世界的动态代理利器》 在Java编程世界中,动态代理是一种强大的技术,它允许我们在运行时创建具有额外行为的对象。CGlib是实现这一目标的重要工具,尤其是对于那些不支持接口的类。本文将深入...

Global site tag (gtag.js) - Google Analytics