`
太阳神喻
  • 浏览: 106813 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JDK动态代理和cglib代理对比

阅读更多

1.JDK动态代理:所要代理的类必须实现了接口。

 

public class JDKProxyFactory implements InvocationHandler{
	private Object targetObject;
	
	public Object createProxyIntance(Object targetObject){
		this.targetObject = targetObject;
		return Proxy.newProxyInstance(this.targetObject.getClass().getClassLoader(), 
				this.targetObject.getClass().getInterfaces(), this);
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {//环绕通知
		PersonServiceBean bean = (PersonServiceBean) this.targetObject;
		Object result = null; 
		if(bean.getUser()!=null){
			//..... advice()-->前置通知
			try {
				result = method.invoke(targetObject, args);
				// afteradvice() -->后置通知
			} catch (RuntimeException e) {
				//exceptionadvice()--> 例外通知
			}finally{
				//finallyadvice(); -->最终通知
			}
		}

		return result;
	}

}

 使用是:

 

                JDKProxyFactory factory = new JDKProxyFactory();
		PersonService service = (PersonService) factory.createProxyIntance(new PersonServiceBean("xxx"));
		service.save("888");

 

2。cglib可实现没有接口的类的代理:

 

package com.fsj.proxy;

import java.lang.reflect.Method;

import com.fsj.service.PersonService;

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


public class CGLIBProxy implements MethodInterceptor{

	private Object targetObject;
	
	public Object createProxyInstance(Object targetObject)
	{
		this.targetObject = targetObject;
		Enhancer enhancer = new Enhancer();//使用cglib的Enhancer		
		//将目标对象的类设置为enhancer的父类,
		//那么enhancer会覆盖目标类中的所有非final的方法,在覆盖方法中加入一些自身的代码
		enhancer.setSuperclass(this.targetObject.getClass());
		//回调自身,前提是必须实现MethodInterceptor接口
		enhancer.setCallback( this);//会回调intercept方法
		//返回代理对象
		return enhancer.create();
	}

	/**
	 * @param proxy 代理对象本身
	 * @param method 拦截到的方法
	 * @param args 方法的所有参数
	 * @param methodProxy 方法的代理对象
	 */
	@Override
	public Object intercept(Object proxy, Method method, Object[] args,
			MethodProxy methodProxy) throws Throwable {
		//调用前处理------------advice()------前置通知
		PersonService ps = (PersonService)this.targetObject;
		Object result = null;
		if(ps.getName()!=null)
		{
			
			try {
				result = methodProxy.invoke(targetObject, args);
				//调用后也可以处理------------afteradvice()--------后置通知
			} catch (Exception e) {
				//出错时处理------------exceptionadvice()---------例外通知
				e.printStackTrace();
			}finally
			{
				//出不出错都处理------------finallyadvice()--------最终通知
			}
		}
		
		return result;
	}
}

 

 

使用是:

 

		PersonService ps = new PersonService();
//		ps.setName("fs");		
		CGLIBProxy cglibProxy = new CGLIBProxy();
		PersonService  psProxy = (PersonService)cglibProxy.createProxyInstance(ps);
		psProxy.add();

 

 

 

分享到:
评论

相关推荐

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

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

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

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

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

    本文主要介绍 Java 中两种常见的动态代理方式:JDK 原生动态代理和 CGLIB 动态代理。 一、 代理模式 代理模式是指程序通过代理类来访问目标对象,以达到对目标对象的控制和增强。代理模式的优点是可以在不改变目标...

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

    然而,对于有接口的情况,JDK代理的创建速度更快。 - **复杂性**:JDK动态代理的API更简洁,易于理解和使用,而CGLIB需要更多的字节码操作知识。 总结起来,选择哪种代理方式取决于具体需求。如果目标对象实现了...

    Java JDK代理、CGLIB、AspectJ代理分析比较

    接下来将详细介绍三种常用的Java代理技术:JDK代理、CGLIB代理以及AspectJ代理,并对比它们各自的优缺点。 #### 二、静态代理实例 静态代理可以通过下面的例子进行说明: ```java public interface Calculator { ...

    AOP 动态代理demo

    4. **对比与选择**:项目可能还会探讨在何时选择JDK动态代理和CGLIB。通常,如果目标对象实现了接口,首选JDK动态代理,因为它不需要额外的字节码生成;如果没有接口,或者性能要求较高,可以选择CGLIB。 在"Aop...

    cglib动态代理

    然而,由于涉及到字节码操作,CGLib在初始化阶段可能比JDK代理慢。 9. **使用示例**:创建一个动态代理通常涉及以下步骤: - 引入CGLib库。 - 创建Enhancer对象,并设置被代理的类以及回调对象。 - 通过Enhancer...

    动态代理(AOP)简单例子

    在Java中,我们可以使用两种主要的方式来实现动态代理:JDK动态代理和CGLIB动态代理。 1. **JDK动态代理**: - JDK动态代理基于接口实现,它要求被代理的目标对象必须实现至少一个接口。代理类会在运行时动态创建...

    JDKProxy:用来理解jdk基于接口的动态代理和cglib基于类代理区别的demo

    本示例"JDKProxy"着重于对比两种常见的动态代理技术:JDK的接口代理和CGLIB的类代理。这两种代理方式在Java应用程序中都有广泛的应用,例如在AOP(面向切面编程)框架如Spring中。 首先,我们来深入了解一下JDK的...

    动态代理原理详细指南

    本篇文章将深入探讨代理模式的原理,特别是静态代理、JDK动态代理以及CGLIB动态代理。 1. **代理模式概述** 代理模式是设计模式中的结构型模式之一,它提供了一种方式来控制对目标对象的访问。代理对象可以看作是...

    动态代理.xmind

    该思维导图主要讲解了代理模式的具体实现,包括jdk代理,cglib代理。其中jdk代理主要讲解了其具体的实现方式、原理...Cglib代理主要讲解了其原理、与JDK代理的对比、Enhancer源码解析、methodProxy和Fastclass源码等。

    Java 代理 代理模式 静态代理与动态代理 常见的动态代理实现 .md

    Spring AOP支持基于JDK Proxy和CGLIB的动态代理。 - **基于JDK Proxy的AOP**:当被代理的目标类实现了接口时,Spring会使用JDK Proxy来创建代理对象。 - **基于CGLIB的AOP**:当被代理的目标类没有实现接口时,...

    动态代理原理实例Demo

    动态代理主要有两种实现方式:JDK自带的`java.lang.reflect.Proxy`类和`java.lang.invoke.MethodHandle`API。这里主要讨论JDK的Proxy类,因为这是最常见且相对简单的实现方式。 1. **Proxy类的使用** - **Proxy....

    java的动态代理

    #### 五、静态代理与动态代理对比 - **静态代理**:如案例中的`People1TimeProxy`类,它显式地实现了`Speak`接口,并在内部持有`People`对象的引用。这种方式较为僵化,每增加一个接口就需要新增一个代理类。 - **...

    动态代理源代码 可以练习用

    CGLIB生成的代理对象效率通常比JDK代理更高,但实现相对复杂。 通过上述内容,我们可以理解Java动态代理的基本原理和使用方法。对于初学者来说,通过练习和编写代码来实践这些概念是加深理解的最佳途径。提供的`...

    java-advance:java进阶,包含 常用设计模式、线程和并发、spring核心代码、mybatis核心代码、springboot2.0、springcloud G版本、docker的使用、各类面试题

    java进阶源码分析专题常用设计模式线程与并发锁的使用深度理解synchronized、volatile、cas手写ASQSpring5IOC容器设计原理及高级特性AOP设计原理FactoryBean与BeanFactorySpring事务处理机制Spring JDK动态代理...

    Spring AOP实现机制

    Spring AOP主要通过两种方式实现:JDK动态代理和CGLIB代理。 - **JDK动态代理**: - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法...

    百度-Java面试.pdf

    在Spring中,AOP通常通过动态代理实现,包括JDK动态代理和CGLIB。JDK动态代理基于接口,如果目标类实现了接口,则会生成代理类来拦截方法调用。而CGLIB则是在运行时生成目标类的子类,适用于未实现接口的类,但无法...

    【动力节点】Java视频教程_SSH框架视频教程之Log4j

    本套Java视频教程详细讲解了代理设计模式的用法。分别讲述了静态代理、JDK动态代理,及CGLIB动态代理的用法,及应用场景对比。此套Java视频教程适合Java初学者,为以后的学习打下坚实基础。

Global site tag (gtag.js) - Google Analytics