你的位置:首页 > 软件开发 > Java > java的动态代理机制

java的动态代理机制

发布时间:2015-12-21 15:00:11
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理就是jav ...

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

在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的:

InvocationHandler:

InvocationHandler is the interface implemented by the invocation handler of a proxy instance. Each proxy instance has an associated invocation handler. When a method is invoked on a proxy instance, the method invocation is encoded and dispatched to the invoke method of its invocation handler.
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentExceptionloader:  一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载interfaces:  一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了h:  一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
java的动态代理机制

好了,在介绍完这两个接口(类)以后,我们来通过一个实例来看看我们的动态代理模式是什么样的:

首先我们定义了一个Subject类型的接口,为其声明了两个方法:

public interface Subject{  public void rent();    public void hello(String str);}
public class RealSubject implements Subject{  @Override  public void rent()  {    System.out.println("I want to rent my house");  }    @Override  public void hello(String str)  {    System.out.println("hello: " + str);  }}
java的动态代理机制

下一步,我们就要定义一个动态代理类了,前面说个,每一个动态代理类都必须要实现 InvocationHandler 这个接口,因此我们这个动态代理类也不例外:

java的动态代理机制
public class Client{  public static void main(String[] args)  {    //  我们要代理的真实对象    Subject realSubject = new RealSubject();    //  我们要代理哪个真实对象,就将该对象传进去,最后是通过该真实对象来调用其方法的    InvocationHandler handler = new DynamicProxy(realSubject);    /*     * 通过Proxy的newProxyInstance方法来创建我们的代理对象,我们来看看其三个参数     * 第一个参数 handler.getClass().getClassLoader() ,我们这里使用handler这个类的ClassLoader对象来加载我们的代理对象     * 第二个参数realSubject.getClass().getInterfaces(),我们这里为代理对象提供的接口是真实对象所实行的接口,表示我要代理的是该真实对象,这样我就能调用这组接口中的方法了     * 第三个参数handler, 我们这里将这个代理对象关联到了上方的 InvocationHandler 这个对象上     */    Subject subject = (Subject)Proxy.newProxyInstance(handler.getClass().getClassLoader(), realSubject        .getClass().getInterfaces(), handler);        System.out.println(subject.getClass().getName());    subject.rent();    subject.hello("world");  }}
java的动态代理机制

我们先来看看控制台的输出:

java的动态代理机制
public Object invoke(Object object, Method method, Object[] args)      throws Throwable  {    //  在代理真实对象前我们可以添加一些自己的操作    System.out.println("before rent house");        System.out.println("Method:" + method);        //  当代理对象调用真实对象的方法时,其会自动的跳转到代理对象关联的handler对象的invoke方法来进行调用    method.invoke(subject, args);        //  在代理真实对象后我们也可以添加一些自己的操作    System.out.println("after rent house");        return null;  }
java的动态代理机制

我们看到,在真正通过代理对象来调用真实对象的方法的时候,我们可以在该方法前后添加自己的一些操作,同时我们看到我们的这个 method 对象是这样的:

public abstract void com.xiaoluo.dynamicproxy.Subject.rent()public abstract void com.xiaoluo.dynamicproxy.Subject.hello(java.lang.String)

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:java的动态代理机制

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。