`

JDK动态代理为什么必须针对接口?其与CGLIB的对比02

阅读更多

 http://www.cnblogs.com/frankliiu-java/articles/1896443.html

应用举例如下:

 

JDK动态代理的简单使用示例:

如有业务类:

package com.proxy;
public class ForumServiceImpl implements ForumService{
    public void removeTopic(int topicId){
        System.out.println("模拟删除记录"+topicId);
        try{
            Thread.currentThread().sleep(20);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }
    public void removeForum(int forumId){
        System.out.println("模拟删除记录"+forumId);
        try{
            Thread.currentThread().sleep(20);
        }catch(Exception e){
            throw new RuntimeException(e);
        }
    }
}
 

1、创建一个实现java.lang.reflect.InvocationHandler 接口的代理类,如:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class PerformanceHandler implements InvocationHandler{
    private Object target; //要进行代理的业务类的实例
    public PerformanceHandler(Object target){
        this.target = target;
    }
//覆盖java.lang.reflect.InvocationHandler的方法invoke()进行织入(增强)的操作
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable{
        System.out.println("Object target proxy:"+target);
        System.out.println("模拟代理加强的方法...");
        Object obj = method.invoke(target, args); //调用目标业务类的方法
        System.out.println("模拟代理加强的方法执行完毕...");
        return obj;
    }
}
 

2、用java.lang.reflect.Proxy.newProxyInstance()方法创建动态实例来调用代理实例的方法:

import java.lang.reflect.Proxy;
public class TestForumService {
    public static void main(String args[]){
        ForumService target = new ForumServiceImpl();//要进行代理的目标业务类
        PerformanceHandler handler = new PerformanceHandler(target);//用代理类把目标业务类进行编织
 
//创建代理实例,它可以看作是要代理的目标业务类的加多了横切代码(方法)的一个子类
        ForumService proxy = (ForumService)Proxy.newProxyInstance(
                target.getClass().getClassLoader(),
                target.getClass().getInterfaces(), handler);
        proxy.removeForum(10);
        proxy.removeTopic(20);
    }
}
 

CGLib动态代理示例:

1、创建一个实现net.sf.cglib.proxy.MethodInterceptor接口的实例来为目标业务类加入进行代理时要进行的操作或增强:

import java.lang.reflect.Method;
import net.sf.cglib.proxy.MethodProxy;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
/**
 *CGlib采用非常底层的字节码技术,可以为一个类创建子类,
 并在子类中采用方法拦截技术拦截父类方法的调用,并顺势进行增强,即是织入横切逻辑
 * @author tufu
 */
public class CglibProxy implements MethodInterceptor{
    private Enhancer enhancer = new Enhancer();
    //覆盖MethodInterceptor接口的getProxy()方法,设置
    public Object getProxy(Class clazz){
        enhancer.setSuperclass(clazz); //设者要创建子类的类
        enhancer.setCallback(this); //设置回调的对象
        return enhancer.create(); //通过字节码技术动态创建子类实例,
    }
    public Object intercept(Object obj,Method method,Object[] args,
            MethodProxy proxy) throws Throwable {
        System.out.println("模拟代理增强方法");
        //通过代理类实例调用父类的方法,即是目标业务类方法的调用
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("模拟代理增强方法结束");
        return result;
    }
}
 

2、通过java.lang.reflect.Proxy的getProxy()动态生成目标业务类的子类,即是代理类,再由此得到代理实例:

import com.proxy.ForumServiceImpl;
import java.lang.reflect.Proxy;
public class TestCglibProxy {
    public static void main(String args[]){
        CglibProxy proxy = new CglibProxy();
        //动态生成子类的方法创建代理类
        ForumServiceImpl fsi =
                (ForumServiceImpl)proxy.getProxy(ForumServiceImpl.class);
        fsi.removeForum(10);
        fsi.removeTopic(2);
    }
}
 
分享到:
评论

相关推荐

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

    JDK动态代理的局限性在于,它只能为实现了至少一个接口的类创建代理,因为代理对象必须继承自这些接口。这种方式适用于那些基于接口进行编程的设计,比如Spring AOP中的Advisor和Advice。 相反,CGLIB(Code ...

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

    JDK 动态代理为什么必须使用接口?这主要是因为 JDK 动态代理是基于接口的代理,它需要一个接口来生成代理类。如果我们想使用 JDK 动态代理,必须提供一个接口,并且将其实现类交给 JDK 动态代理来生成代理类。这样...

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

    JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始类相同的接口,并且在调用接口方法时,可以插入自定义的逻辑。这样,我们就可以在不...

    JDK动态代理和CGLIB代理

    相比于JDK动态代理,CGLIB可以在没有接口的情况下进行代理,因此对于未实现接口的类,CGLIB是更好的选择。CGLIB使用ASM库来生成和加载代理类的字节码。 使用CGLIB代理通常需要引入cglib库,然后通过`...

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

    与JDK动态代理不同,CGLIB不依赖于接口,而是通过继承目标类来创建代理对象。 1. **CGLIB核心组件**:主要包括`Enhancer`、`Callback`和`MethodInterceptor`。`Enhancer`是增强对象的主要工具,`Callback`是一系列...

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

    综上所述,AOP为软件设计带来了模块化和解耦的优势,Spring通过JDK动态代理和CGLib动态代理提供了灵活的实现。理解并掌握这两种代理方式,对于深入理解和有效利用Spring AOP至关重要。在实际开发中,根据业务需求和...

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

    与JDK动态代理不同,CGLIB并不依赖于接口,而是直接对类进行增强。它使用ASM库在内存中构建新的字节码,生成的目标类会继承自原始类。因此,对于没有实现接口的类,CGLIB可以提供动态代理功能。 性能方面,CGLIB...

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

    与JDK动态代理不同,CGLIB并不依赖接口,而是通过字节码技术生成一个被代理类的子类来实现。这使得CGLIB能够代理没有实现接口的类。CGLIB的核心是ASM库,它能直接操作字节码生成新的类。在Spring中,如果目标类没有...

    jdk动态代理和CGlib动态代理

    JDK动态代理适用于目标类已经实现了接口的情况,而CGlib则可以处理未实现接口的类。两者都可以在运行时增加额外的行为,但实现方式和性能特性有所不同。JDK动态代理通常更简洁,因为不需要生成子类,但对目标类的...

    jdk 的动态代理和CGLIB代理

    jdk 的动态代理和CGLIB代理

    JDK代理和Cglib代理

    与JDK代理不同,Cglib不需要目标对象实现任何接口,而是通过继承的方式创建代理。这使得Cglib在处理未实现接口的类时更为灵活。 1. **Cglib Enhancer**:Enhancer是Cglib的核心类,它负责生成子类并进行增强。我们...

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

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

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

    JDK和CGLIB是两种常用的实现Java动态代理的方式。本文将深入探讨这两个库以及它们的工作原理。 **JDK动态代理** JDK动态代理基于Java反射API实现,它提供了`java.lang.reflect.Proxy`类和`java.lang.reflect....

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

    总结来说,JDK动态代理适用于需要代理接口的情况,而CGLIB则可以处理没有接口的类。两者都是为了在运行时增强对象的功能,提供了灵活的代码扩展机制。在实际开发中,可以根据具体需求选择适合的动态代理方式。

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

    主要存在两种常见的动态代理技术:JDK动态代理和CGLIB(Code Generation Library)动态代理。本文将深入探讨这两种技术的区别和原理。 **JDK动态代理**: JDK动态代理是Java标准库提供的一种代理机制,位于`java....

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

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

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

    JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。以下是一些关键知识点: 1. **Proxy类**:...

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

    Spring支持JDK动态代理和CGLIB动态代理,根据目标类是否实现了接口来选择合适的代理方式。 总结来说,代理模式是软件设计中的一个重要工具,它提供了在不修改原始对象的前提下扩展功能的能力。Java中的静态代理、...

    JDK动态代理_JDK动态代理

    本文将详细介绍JDK动态代理的原理与应用,帮助读者深入理解其工作方式以及如何在实际项目中运用。 #### 二、JDK动态代理简介 JDK动态代理是Java平台提供的一个工具包,用于在运行时创建代理对象。它主要适用于实现...

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

    相比JDK动态代理,Cglib不需要目标类实现接口,因此适用于无法修改源码或不希望实现接口的情况。 2. **Cglib动态代理实现过程**: - 引入Cglib库,如cglib-nodep-3.3.0.jar。 - 创建一个实现了`MethodInterceptor...

Global site tag (gtag.js) - Google Analytics