【第22期】观点:IT 行业加班,到底有没有价值?

Java中的动态代理

原创 2016年08月28日 21:02:04

动态代理:运行过程中根据传来的参数动态的在内存中创建代理类。

模式图:

上图中没有看到代理类,在动态代理中代理类都是更加LogHandler中的newProxyInctance方法中的对象参数在内存中实时的实例化出来的。Java本身对该模式有实现,会应用到Proxy类和InvocationHandler,下面通过实例来看一下动态代理是如何实际应用的。

首先还是要有一个接口,及接口的实现类,这个实现类也就是会被代理的类,如下:

接口————

<span style="font-size:18px;">public interface UserManager {
 
         public voidaddUser(String userId, String userName);
        
         public voiddelUser(String userId); 
        
}</span>

实现————

<span style="font-size:18px;">public class UserManagerImpl implements UserManager {
 
         public voidaddUser(String userId, String userName) {
                   System.out.println("UserManagerImpl.addUser()userId-->>" + userId);
         }
 
         public voiddelUser(String userId) {
                   System.out.println("UserManagerImpl.delUser()userId-->>" + userId);
         }
 
}</span>


创建一个类实现InvocationHandler接口,代码如下:

<span style="font-size:18px;">public class LogHandler implements InvocationHandler {
        
         private ObjecttargetObject;
         public ObjectnewProxyInstance(Object targetObject) {
                   this.targetObject= targetObject;
                   returnProxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                                                                    targetObject.getClass().getInterfaces(),this);
         }
        
         public Objectinvoke(Object proxy, Method method, Object[] args)
                            throwsThrowable {
                   System.out.println("start-->>"+ method.getName());
                   for (inti=0; i<args.length; i++) {
                            System.out.println(args[i]);
                   }
                   Object ret =null;
                   try {
                            //调用目标方法
                            ret= method.invoke(targetObject, args);
                            System.out.println("success-->>"+ method.getName());
                   }catch(Exceptione) {
                            e.printStackTrace();
                            System.out.println("error-->>"+ method.getName());
                            throwe;
                   }
                   return ret;
         }
}</span>


Proxy类:

Proxy.newProxyInstance(Class Loader loader, Class<?>[] interfaces, InvocationHandler h);

Loader:被代理对象的类加载器,可以通过Object.getClass().getClassLoader()获取。

Interface:被代理类实现的接口,通过该参数被创建的动态代理中会有和被代理对象一样的方法。

h:实现了InvocationHandler接口的类,一般都是我们创建的实现类本身,所以直接传this即可。

InvocationHandler接口:

该接口中有一个invoke(Objectproxy, Method method, Object[] args)方法,该方法是动态

代理被调用了代理的方法后回调的函数。

         Method:被调用的方法

         Args:被调用的方法所有的参数

         当回调到invoke方法是用动态的调用被代理对象中有具体实现的方法,用的是method.invoke(Object obj, Object... args);

         Obj:被代理的对象

         Args:方法中的参数。

客户端调用:

<span style="font-size:18px;">public class Client {
         publicstatic void main(String[] args) {
                   LogHandlerlogHandler = new LogHandler();
                   UserManageruserManager = (UserManager)logHandler.newProxyInstance(new UserManagerImpl());
                   userManager.addUser("0001","张三");
         }
}</span>

整个的流程如下:

客户端调用LogHandler的方法会返回一个代理类,当调用方法是调用的是代理类中的方法,不论调用什么方法代理类都会回调LogHandler中的invoke方法,在invoke方法中可以调用真实类的方法,然后将结果一层一层的返回。

 

小结:

        动态代理模式解决了静态代理模式扩展过多类的问题,但是动态代理会影响性能要适当使用。实例展示的是打印规定内容,而Spring中的AOP打印日志就是动态代理的实现,总结相关博客进一步了解动态代理和AOP的实现原理。

版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

java动态代理原理及结构

代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问。代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理。...

java 动态代理

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是java的动态代理机制,所...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中。这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码。JVM虚拟机读取字节码文...

java的动态代理机制详解

from: http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知...

Java-CGLib动态代理

导读 问题 CGLib动态代理和JDK动态代理的区别 CGLib概述 改造导读Spring-AOP基础知识Java-JDK动态代理Java-CGLib动态代理问题另一篇博文中的问题性能监视横切逻辑代码...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)