`

Java 动态代理实现

 
阅读更多

     看了 stamen的学习spring必要的java基础知识,感觉受益匪浅,也把我学到的记录下来,巩固下加深记忆,也便于以后回来看。

      动态代理的应用仔细想起来感觉不是很多,我能想到的就是写日志,事物管理,不过这种模式的话在以后的工作中可能会用得到。

      java的动态代理有两种机制,一种是jdk的动态代理,另一种就是cglib的动态代理,两者的区别在于jdk动态代理是基于接口实现的,而cglib跳过了接口直接支持类的代理。

      先说下我对动态代理的理解吧,用下面一个图

 
     

                                                (代理调用图)

        首先通过我们的对象生成代理对象,并将实现了我们需要的业务逻辑对象的类织入到代理对象中,然后代理对象调用我们类的方法,然后织入的对象拦截到我们的方法,在我们执行的方法前或执行方法后先调用我们已经写好的逻辑,然后通过反射的invoke方法调用被代理对象的方法,从而实现了动态代理调用打个比方,就像我们买票,我们直接去火车站买看做是直接调用,但是我们想知道我们什么时候去的,还不想在我们自己的逻辑里写,那我们就可以去找代购点,它就相当于我们的代理,我在他这买车票,在买票前或买票后 他帮我们记下我们啥时候买的票,再调用我们买票的方法拿钱给票,这样既不用我们自己去记什么时候买的票,又有人帮我们记下了,就实现了代理切入。

     利用动态代理技术的话,去执行方法的对象就一定是代理对象,那么使用的重点就变成了如何去创建代理对象。下面看下两种方式如何去创建自己的代理对象。

    、jdk代理对象的创建:

         首先了解下jdk创建代理的方法,如下代码,它需要三个参数,第一个参数是被创建代理类的加载器,第二个是他实现的接口,第三个是实现InvocationHander接口的一个类,我们的操作代码其实就是写到这个类中,然后利用反射去调用被代理类的方法。

public static Object newProxyInstance(ClassLoader loader,
					  Class<?>[] interfaces,
					  InvocationHandler h)

        看下执行的代码,从stamen的博客中摘取的代码,其中③-1处可以写我们自己的处理代码。

 

public class PerformanceHandler implements InvocationHandler {//①实现InvocationHandler
    private Object target;
	public PerformanceHandler(Object target){ //②target为目标的业务类
		this.target = target;
	}
	public Object invoke(Object proxy, Method method, Object[] args) ③
			throws Throwable {
		//③-1
		Object obj = method.invoke(target, args);// ③-2通过反射方法调用业务类的目标方法
		//③-1
		return obj;
	}
}

    然后是调用的代码,也是摘取的。

public class TestForumService {
	public static void main(String[] args) {
               
               //①希望被代理的目标业务类
		ForumService target = new ForumServiceImpl(); 
		
               //②将目标业务类和横切代码编织到一起
		PerformanceHandler handler = new PerformanceHandler(target);
		
                //③根据编织了目标业务类逻辑和性能监视横切逻辑的InvocationHandler实例创建代理实例
		ForumService proxy = (ForumService) Proxy.newProxyInstance(  
				target.getClass().getClassLoader(),
				target.getClass().getInterfaces(),
				handler);

                //④调用代理实例
		proxy.removeForum(10);   
		proxy.removeTopic(1012);
	}
}

  

    二、CGLib方式实现动态代理

            CGLib创建代理对象所依靠的是net.sf.cglib.proxy.Enhancer对象,Enhancer setSuperclass方法确定要创建代理的类,setCallback方法确定执行代理方法的类,然后调用create()方法去创建并返回CGLib代理对象,setCallback方法中的参数是要继承net.sf.cglib.proxy.Callback接口的并实现intercept方法的类,在这里我们用创建一个类继承MethodInterceptor接口,MethodInterceptor接口是继承Callback接口的,也就是间接地继承了Callback接口。然后在我们用代理类去调用方法是,就可以执行 intercept方法中我们加入的逻辑,看下代码可能会更清晰,仍然摘取。。。

public class CglibProxy implements MethodInterceptor {
	private Enhancer enhancer = new Enhancer();
	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 {
		//③-1
		Object result=proxy.invokeSuper(obj, args); ③-2 
		//③-1
		return result;
	}
}

   上面的 ③-1处可以加入我们自己的逻辑。 下面是利用代理执行操作代码,go on 摘取,手懒啊!!!!

package com.baobaotao.proxy;
import java.lang.reflect.Proxy;
public class TestForumService {
	public static void main(String[] args) {
	  CglibProxy proxy = new CglibProxy();
	  ForumServiceImpl forumService = ① 
	            (ForumServiceImpl )proxy.getProxy(ForumServiceImpl.class);
	  forumService.removeForum(10);
	  forumService.removeTopic(1023);
	}
}

  这样就实现了CGLib的代理方式。在上面的代码中 CGLibProxy中的getProxy是可以提出到main方法中去实现的,具体的执行就像下面这样

package com.baobaotao.proxy;
import java.lang.reflect.Proxy;
public class TestForumService {
	public static void main(String[] args) {
		Enhancer enhancer = new Enhancer();
		enhancer.setSuperclass(ForumServiceImpl); 
	    enhancer.setCallback(CglibProxy);    
	    
		ForumServiceImpl forumService = (ForumServiceImpl )enhancer.create();
		forumService.removeForum(10);
		forumService.removeTopic(1023);
	}
}
 

 

 

  • 大小: 5.5 KB
分享到:
评论

相关推荐

    用Java动态代理实现AOP

    Java动态代理实现AOP Java动态代理是实现Aspect Oriented Programming(AOP)的重要手段。在Java中,动态代理可以通过java.lang.reflect InvocationHandler接口和java.lang.reflect.Proxy类来实现。AOP的主要思想...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经难以满足现代软件工程的需求。为了更好地管理跨切面的关注点,如日志记录、性能监控、安全控制等,面向切面...

    Java动态代理实现数据源连接池

    总的来说,Java动态代理实现数据源连接池的核心思想是利用`InvocationHandler`来拦截对数据库操作的调用,通过代理对象在每次操作前后进行连接的获取和释放,从而实现连接池的逻辑。这种方式虽然相比现成的连接池库...

    java动态代理实现数据库连接池

    ### Java动态代理实现数据库连接池 #### 背景与挑战 在开发应用程序时,数据库连接池是一个常用且重要的组成部分。频繁地建立和断开数据库连接不仅效率低下,还可能导致性能瓶颈。为了解决这一问题,引入了数据库...

    用Java动态代理实现委托模式

    下面我们将详细探讨如何使用Java动态代理实现委托模式,以及相关的源码和工具应用。 首先,理解委托模式的基本概念。委托模式通常由三部分组成:委托者(Delegate)、被委托者(Subject)和客户端(Client)。委托...

    java动态代理实现详解

    Java 动态代理是Java平台提供的一种强大的工具,它允许我们在运行时动态生成代理类,这些代理类可以实现一组指定的接口,同时还能在方法调用前后添加自定义的行为。这种机制大大简化了面向切面编程(AOP)和事件监听...

    使用Java动态代理实现一个简单的网络请求拦截器.txt

    ### 使用Java动态代理实现一个简单的网络请求拦截器 #### 一、引言 在软件开发过程中,为了增强程序的功能或方便进行调试与监控,我们常常需要在不改变原有业务逻辑的基础上,添加一些额外的行为(如日志记录、...

    java 动态代理实现注解日志拦截

    在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录相关的日志信息。 首先,让我们了解Java动态代理的基本概念。在Java中,动态代理主要由两个类实现:`java.lang.reflect....

    java动态代理实现自定义连接池

    Java中的动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现的。Proxy类用于创建动态代理实例,而InvocationHandler接口则定义了调用处理程序的逻辑,即当代理对象的方法被...

    java动态代理 经典文章(word 2007格式的)

    - `设计模式:用Java动态代理实现AOP.docx`可能包含了如何使用Java动态代理来实现设计模式,尤其是代理模式,以达到AOP的效果。 - `Spring AOP入门实例详解.docx`可能涵盖了Spring AOP的基本概念、配置以及如何...

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

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

    JAVA实现动态代理的简单流程

    在深入探讨Java动态代理的实现过程之前,我们首先需要理解动态代理的基本概念及其在Java中的应用价值。动态代理,顾名思义,是在运行时动态创建代理对象的一种机制,它无需在编译期就确定代理类的具体实现,而是通过...

    Java动态代理实现 Proxy InvocationHandler

    在本文中,我们将深入探讨这两个关键组件以及如何使用它们来实现动态代理。 ### 1. Java动态代理的基本概念 动态代理允许我们在运行时创建一个实现了特定接口的新类。这个新类(代理类)可以代理原始类(目标类)...

Global site tag (gtag.js) - Google Analytics