`
中国爪哇程序员
  • 浏览: 167613 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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

    博客分类:
  • java
 
阅读更多
AOP 使用的设计模式就是代理模式,是对IOC设计的补充。为了扩展性,往往会加上反射,动态生成字节码,生成代理类。
这里往往还会使用到DI,把代理的实现类通过依赖注入的方式,传给代理工厂。
关于生成动态代理类的方式有两种:JDK和CGLIB。
CGLIB,是一个开源工具。spring 和hibernate已经广泛使用。

关于AOP的概念解释网上有很多。
附件的内容是关于JDK和CGLIB动态生成代理工厂的实例。

JDK动态代理和CGLIB字节码生成的区别?
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final

CGLIB:

	public Object createProxyObject(Object obj) {
		this.targetObject = obj;
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(obj.getClass());
		enhancer.setCallback(this);
		Object proxyObj = enhancer.create();
		return proxyObj;// 返回代理对象,返回的对象其实就是一个封装了“实现类”的代理类,是实现类的实例。
	}


JDK:

	public Object newProxy(Object targetObject) {// 将目标对象传入进行代理
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
				targetObject.getClass().getInterfaces(), this);// 返回代理对象
	}

看上面的代码。在动太生成代理类时,传递的是实现类所所实现的接口argetObject.getClass().getInterfaces()。JDK只能对于接口进行做代理。如果换成类的话,则会抛java.lang.ClassCastException异常。

分享到:
评论

相关推荐

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

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

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

    Spring 框架中 JDK 动态代理和 CGLIB ...JDK 动态代理可以代理接口,而 CGLIB 动态代理可以代理类和接口。Spring AOP 框架会根据实际情况选择使用 JDK 动态代理还是 CGLIB 动态代理,从而确保可以代理任何类型的对象。

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

    - `InvocationHandler`是JDK动态代理的核心,它定义了一个invoke()方法,该方法会在代理类调用目标方法时被触发。 - 我们需要实现`InvocationHandler`接口,重写invoke()方法,当调用代理对象的方法时,实际执行的...

    JDK动态代理和CGLIB代理

    CGLIB使用ASM库来生成和加载代理类的字节码。 使用CGLIB代理通常需要引入cglib库,然后通过`MethodInterceptor`接口和`Enhancer`类来实现。以下是一个CGLIB代理的例子: ```java import ...

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

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

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

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

    JDK和CGlib分别实现的动态代理源代码

    两者在性能上,CGlib通常比JDK代理稍快,但创建代理的过程相对复杂。选择哪种代理方式取决于具体的需求和项目情况。了解并掌握这两种动态代理技术,能够使你在处理AOP(面向切面编程)等高级编程需求时游刃有余。

    cgLib与JDK动态代理的用法

    代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。代理类与委托类之间通常会存在关联关系,一个代理类...

    JDK代理和Cglib代理

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

    jdk动态代理和CGlib动态代理

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

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

    JDK 动态代理的优点是可以在运行时生成代理类,无需编写代理类代码。 四、 CGLIB 动态代理 CGLIB 动态代理是另外一种动态代理方式,使用 ASM 字节码操作库来生成代理类。CGLIB 动态代理的优点是可以代理 final 类...

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

    与JDK的动态代理不同,JDK代理基于接口,如果目标类没有实现接口,就无法使用JDK的动态代理。而CGlib则无需目标类实现任何接口,因此它的应用范围更广。 以下是使用CGlib实现动态代理的关键步骤: 1. 引入依赖:在...

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

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

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

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

    cglib动态生成java类

    CGLib,全称为Code Generation ...总的来说,CGLib是Java开发中一个不可或缺的工具,尤其在需要动态生成和修改类的场景下,它的高效和灵活使其成为首选。了解并熟练掌握CGLib,对于提升Java开发能力具有重要意义。

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

    类加载器用于生成代理类,接口数组定义了代理对象需要实现的接口,`InvocationHandler`则处理对代理对象的所有方法调用。 2. **过程**:当通过代理对象调用某个方法时,实际执行的是`InvocationHandler.invoke()`...

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

    - **灵活性**:JDK代理要求目标类实现接口,而Cglib无此限制。 - **使用场景**:如果目标类已经实现了接口,且不关心性能,优先选择JDK代理;否则,Cglib是更好的选择。 在`DynamicProxyTest`源码中,我们可以看到...

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

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

    动态代理-jdk、cglib、javassist.zip

    CGLIB通过字节码技术生成代理类,它使用ASM库来操作字节码,因此可以为非接口类型创建代理。CGLIB的使用主要包括: 1. 引入CGLIB库。 2. 创建Enhancer对象,它是CGLIB的核心,用于生成代理类。 3. 设置回调机制,即...

Global site tag (gtag.js) - Google Analytics