目前的Java开发包中包含了对动态代理的支持,但是其实现只支持对接口的的实现。即如果想对一个类进行动态代理,那么这个类首先要继承了某个接口,否则就无法对其进行代理。
CGLIB就可以对一个普通java类进行代理,不需要其实现任何接口。CBLIB的实现采用非常底层的字节码技术,为一个类动态生成一个子类,并在子类中覆盖其父类所有的非final的方法,对其进行拦截,以实现动态代理的效果,是对JDK动态代理的一个很好的补充。
我写了个小例子,HelloWorld类为业务方法类(没有实现任何接口),其中包括一个有返回值和无返回值的两个方法,CglibProxy为动态代理类,在这个类中可以实现对HelloWorld类方法的拦截,可以把诸如权限校验、记录日志这样的横切性问题在这里进行处理。
业务实现类:
package com.why.cglib.proxy;
/**
* 业务实现类
* @author why
*
*/
public class HelloWorld{
public void sayHello() {
System.out.println("执行了 sayHello()");
}
public String sayHelloWithReturnValue() {
String str = "HelloWorld!";
System.out.println("执行了 sayHelloWithReturnValue()");
return str;
}
}
动态代理类:
package com.why.cglib.proxy;
import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
/**
* 动态代理类
* @author why
*
*/
public class CglibProxy implements MethodInterceptor{
private Object targetObject;//要代理的目标对象
public Object newProxy(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 {
Object result = null;;
doBefore();
try{
result = methodProxy.invokeSuper(proxy, args);//调用原始对象的方法
doAfter();
}catch (Exception e) {
e.printStackTrace();
doWhenException();
}finally{
doFinally();
}
return result;
}
private void doBefore() {
System.out.println("before method invoke!");
}
private void doAfter() {
System.out.println("after method invoke!");
}
private void doWhenException() {
System.out.println("WhenException method invoke!");
}
private void doFinally() {
System.out.println("Finally method invoke!");
}
}
测试类:
package com.why.cglib.proxy;
public class Test {
/**
* CGLIB 动态代理
*
* @param args
*/
public static void main(String[] args) {
CglibProxy cglibProxy = new CglibProxy();
HelloWorld proxy = (HelloWorld)cglibProxy.newProxy(new HelloWorld());
proxy.sayHello();
System.out.println("\n---------------------------------\n");
String str = proxy.sayHelloWithReturnValue();
System.out.println("str = " + str);
}
}
分享到:
相关推荐
- **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...
CGlib则是Java动态代理的一种实现方式,尤其是在不提供接口的情况下,它通过生成目标类的子类来实现动态代理。 在Java中,JDK自带的动态代理机制是基于接口的,如果被代理的类没有实现任何接口,那么就无法使用JDK...
Spring框架是AOP实现的一个典范,它提供了两种主要的动态代理方式:JDK动态代理和CGLib动态代理。 **JDK动态代理**: JDK动态代理基于Java的反射API实现,适用于接口代理。当目标对象实现了至少一个接口时,Spring...
- **CGLIB代理**:CGLIB通过ASM生成一个继承自目标类的新类,这个新类覆盖了目标类的所有方法,并在这些方法内部调用拦截器链。在运行时,这个新类的实例作为代理对象。 5. **优缺点**: - JDK代理简单易用,但...
本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践,帮助开发者深入理解并掌握这些技术。 首先,让我们来探讨JDK动态代理。Java标准库中的`java.lang.reflect.Proxy`类和`...
Spring 框架中 JDK 动态代理和 CGLIB 动态代理是 Spring AOP 中一个非常重要的知识点。Spring AOP 框架会根据实际情况选择使用 JDK 的动态代理还是 CGLIB 的动态代理。 JDK 动态代理是 Java 自带的动态代理机制,它...
CGlib动态代理是Java开发中一个非常重要的工具库,它主要用来实现代理模式,尤其在面向切面编程(AOP)中发挥着关键作用。CGlib是一个强大的高性能的代码生成库,它可以在运行期扩展Java类与实现Java接口。CGlib并不...
### cglib动态代理详解 #### 一、cglib简介 cglib(Code Generation Library)是一个功能强大、性能高效且质量卓越的代码生成类库。它能够在程序运行时动态地扩展Java类并实现Java接口,其核心是利用ASM(Another ...
- 如果目标类中包含静态方法,CGlib代理不会影响静态方法的行为。 总结,CGlib是一个强大且灵活的工具,它通过字节码生成技术实现了对Java类的动态代理,尤其在没有接口约束或者性能要求高的情况下,它是Java开发者...
本文将深入探讨如何在基于Maven的项目中利用CGLib库实现动态代理。CGLib(Code Generation Library)是Java中一个高性能的代码生成库,它在运行期通过字节码技术为类创建子类,以此实现动态代理。 1. Maven项目配置...
jdk和cglib动态代理的例子{jar包+源码} 解压:如有问题 用快压
Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...
CGlib是Java动态代理的一种实现方式,它不是依赖于Java的反射机制,而是通过生成目标类的子类来实现代理,因此在性能上通常优于基于接口的JDK动态代理。 CGlib动态代理的核心类包括`Enhancer`、`Callback`和`...
CgLib就是实现这种动态代理的一个工具,特别是在不支持接口的类上。 CgLib的核心功能是通过字节码技术创建子类。当目标类没有实现接口时,Java的标准动态代理机制JDK Proxy就无法工作,因为JDK Proxy是基于接口的。...
Cglib 动态代理的实现方式是:我们首先需要定义一个类,然后使用 Cglib 库来生成该类的代理对象,该代理对象将拦截对被代理对象的所有方法调用,并控制对被代理对象的访问。 Cglib 动态代理的优点是:它的实现方式...
在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...
CGlib是Java编程语言中的一个库,主要用于生成子类,以提供方法拦截和动态代理功能。它是对Bytecode Generation Library(字节码生成库)的一个封装,能够在运行时动态创建新类和对象,广泛应用于AOP(面向切面编程...
Java提供了两种主要的动态代理实现方式:JDK动态代理和CGLIB动态代理。 **JDK动态代理**: JDK动态代理基于接口实现,也就是说,被代理的对象必须实现至少一个接口。代理机制的核心是`java.lang.reflect.Proxy`类和...
本篇将详细探讨JDK动态代理和Cglib动态代理,并通过源码实例来加深理解。 首先,JDK动态代理是Java内置的一种机制,它依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类...
当无法或者不想使用Java标准的JDK动态代理(只能代理接口实现类)时,CGLib可以生成目标类的子类来实现对目标对象的代理。这个过程中,CGLib的核心类`Enhancer`起到了关键作用。`Enhancer`允许开发者指定被代理的...