`

JDK动态代理和cglib生成代理

 
阅读更多
http://blog.csdn.net/zdp072/article/details/25657995
[ JDK生成代理 ]
JDK中给我们提供了一个Proxy类可以动态的给我们生成代理.
假定我们要做一个权限管理系统, 需要控制用户对某一个方法的访问. 如果user为null, 那么不让用户访问save方法.

① 接口类: PersonService
public interface PersonService {  
    public void save();  
}  

② 实现类: PersonServiceImpl
public class PersonServiceImpl implements PersonService {  
    private String user;  
      
    public PersonServiceImpl(){  
    }  
      
    public PersonServiceImpl(String user) {  
        this.user = user;  
    }  
  
    public void save() {  
        System.out.println("执行了save()方法");  
    }  
  
    public String getUser() {  
        return user;  
    }  
} 

③ 生成代理类工厂: JDKProxyFactory
public class JDKProxyFactory implements InvocationHandler {  
    private Object targetObject; //代理的目标对象  
  
    public Object createProxyIntance(Object targetObject) {  
        this.targetObject = targetObject;  
        /** 
         * 第一个参数设置代码使用的类装载器,一般采用跟目标类相同的类装载器 
         * 第二个参数设置代理类实现的接口 
         * 第三个参数设置回调对象,当代理对象的方法被调用时,会委派给该参数指定对象的invoke方法 
         */  
        return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(),   
                                      this.targetObject.getClass().getInterfaces(),   
                                      this);  
    }  
  
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
        PersonServiceImpl ps = (PersonServiceImpl) this.targetObject;  
        Object result = null;  
        if (ps.getUser() != null) { // 如果user为null, 则无法调用目标方法  
            result = method.invoke(targetObject, args); // 把方法调用委派给目标对象  
        }  
        return result;  
    }  
}
 
④ 测试一把:
public class PersonServiceImplTest {  
    @Test  
    public void testJDKProxy() {  
        JDKProxyFactory factory = new JDKProxyFactory();  
        PersonService personService = (PersonService) factory.createProxyIntance(new PersonServiceImpl("zhangsan"));  
        personService.save();  
    }  
}  


[ CGLIB生成代理 ]
Cglib是一个优秀的动态代理框架,它的底层使用ASM在内存中动态的生成被代理类的子类。
使用CGLIB生成代理需要引入cglib-nodep-2.1_3.jar
① CBLIG生成代理工厂: CGlibProxyFactory
public class CGlibProxyFactory implements MethodInterceptor {  
    private Object targetObject;  
  
    public Object createProxyIntance(Object targetObject) {  
        this.targetObject = targetObject;  
        Enhancer enhancer = new Enhancer();  
        enhancer.setSuperclass(this.targetObject.getClass()); // 设置代理类的父类  
        enhancer.setCallback(this); // 设置回调函数  
        return enhancer.create();  
    }  
  
    public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {  
        PersonServiceImpl bean = (PersonServiceImpl) this.targetObject;  
        Object result = null;  
        if (bean.getUser() != null) { // 如果user为null, 则无法调用目标方法  
            result = methodProxy.invoke(targetObject, args);  
        }  
        return result;  
    }  
} 

② 测试一把
public class PersonServiceImplTest {  
    @Test  
    public void testCGLIBProxy() {  
        CGlibProxyFactory factory = new CGlibProxyFactory();  
        PersonService personService = (PersonServiceImpl) factory.createProxyIntance(new PersonServiceImpl("lisi"));  
        personService.save();  
    }  
} 


[ 比较两种代理 ]
1. 使用JDK的动态代理, 被代理类一定要实现了某个接口, 而使用CGLIB, 被代理类没有实现任何接口也可以实现动态代理功能,
2. 因为采用的是继承, 所以cglib无法对使用final修饰的类使用代理.
3. CGLIB的速度要远远快于JDK Proxy动态代理.
分享到:
评论

相关推荐

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

    在内存占用上,两者差别不大,但CGLIB生成的代理类可能略微增加内存负担。 在工具支持上,Spring框架对两者都有很好的支持。Spring AOP默认使用JDK动态代理,但如果目标类没有实现接口,它会自动切换到CGLIB。在...

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

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

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

    如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。 CGLIB 动态代理是基于类的代理, 它可以代理类和接口。CGLIB 动态代理使用 ASM 字节码工具来生成代理类。CGLIB ...

    JDK动态代理和CGLIB代理

    JDK动态代理和CGLIB代理是两种常用的实现方式。 首先,我们来看看JDK动态代理。JDK动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类用于创建一个代理对象...

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

    2. **Proxy类**:用于创建动态代理对象,通过`newProxyInstance()`静态方法,传入类加载器、接口数组和InvocationHandler实例来生成代理对象。 3. **实现过程**:首先,你需要定义一个接口,然后创建实现该接口的...

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

    CGLib的优点是它可以代理任何类,无需目标对象实现接口,但相比JDK动态代理,它的运行效率较低,且由于生成了子类,可能会引起类加载和内存占用的问题。 **Spring AOP的应用**: 在Spring框架中,AOP主要用于日志...

    jdk动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....

    JDK动态代理和Cglib动态代理实例源码

    - 创建代理对象:根据选择的代理方式(JDK或Cglib),调用相应的生成代理对象的方法。 - 定义目标方法:定义被代理类的方法,这可以是接口中的方法,对于Cglib,也可以是任意非final的方法。 - 实现`...

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

    JDK动态代理的示例可能包括创建一个代理工厂,生成代理对象并实现InvocationHandler。CGLIB示例可能涉及使用Enhancer类来生成代理对象。对于拦截器,可能会展示如何定义和注册拦截器,以及如何构建拦截器链。此外,...

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

    本篇将深入探讨两种主要的Java动态代理技术:JDK动态代理和CGLIB。 首先,我们来了解一下JDK动态代理。JDK动态代理基于Java反射API实现,主要用于接口代理。以下是一个简单的JDK动态代理的使用步骤: 1. **定义...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    JDK 动态代理是 Java 中的一种动态代理方式,使用 Java 反射机制来生成代理类。JDK 动态代理的优点是可以在运行时生成代理类,无需编写代理类代码。 四、 CGLIB 动态代理 CGLIB 动态代理是另外一种动态代理方式,...

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

    CGLIB使用ASM库生成代理类的字节码并加载到内存中。当原始类没有接口时,CGLIB比JDK动态代理更适用。 ```java // 引入CGLIB依赖 <groupId>cglib <artifactId>cglib <version>3.3.0 // 使用CGLIB创建代理 ...

    JAVA动态代理实现Demo(JDK动态代理和CGLIB动态代理)

    Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...

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

    JDK动态代理只能为实现了至少一个接口的类生成代理。它的基本原理是利用反射机制生成一个实现了目标接口的子类,然后通过这个子类来调用原对象的方法。因此,如果目标类没有实现任何接口,JDK动态代理就无法工作。 ...

    静态代理、jdk动态代理、cglib动态代理

    Cglib 动态代理的实现方式是:我们首先需要定义一个类,然后使用 Cglib 库来生成该类的代理对象,该代理对象将拦截对被代理对象的所有方法调用,并控制对被代理对象的访问。 Cglib 动态代理的优点是:它的实现方式...

    JDK代理和Cglib代理

    JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...

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

    1. **Enhancer类**:CGLIB的核心类,用于配置和生成代理对象。你可以设置回调方法、过滤器等,然后通过`enhance()`方法生成代理对象。 2. **MethodInterceptor接口**:类似于JDK的`InvocationHandler`,`...

    jdk与cglib动态度代理的区别原理

    2. **过程**:CGLIB使用`Enhancer`类作为入口,通过设置回调函数(Callback)和目标对象,生成代理子类。回调函数通常是一个实现了`MethodInterceptor`接口的对象,它在拦截方法调用时执行自定义逻辑。 3. **优点**...

    java 动态代理实例(JDK代理与CGLIB代理)

    动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...

Global site tag (gtag.js) - Google Analytics