要想了解Java 动态代理,你要学会这些!

要想了解Java动态代理,首先要了解什么叫做代理,熟悉设计模式的朋友一定知道在Gof总结的23种设计模式中,有一种叫做代理(Proxy)的对象结构型模式,动态代理中的代理,指的就是这种设计模式。

在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.

要想了解Java 动态代理,你要学会这些!

每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。我们来看看InvocationHandler这个接口的唯一一个方法 invoke 方法:

Object invoke(Object proxy, Method method, Object[] args) throws Throwable

一个动态代理的demo

import java.lang.reflect.InvocationHandler;

import java.lang.reflect.Method;

import java.lang.reflect.Proxy;

public class HelloServiceProxy implements InvocationHandler {

private Object target;

/**

* 绑定委托对象并返回一个【代理占位】

* @param target 真实对象

* @return 代理对象【占位】

*/

public Object bind(Object target, Class[] interfaces) {

this.target = target;

//取得代理对象

return Proxy.newProxyInstance(target.getClass().getClassLoader(),

target.getClass().getInterfaces(), this);

}

@Override

/**

* 同过代理对象调用方法首先进入这个方法.

* @param proxy --代理对象

* @param method -- 方法,被调用方法.

* @param args -- 方法的参数

*/

public Object invoke(Object proxy , Method method, Object[] args) throws Throwable {

System.err.println("############我是JDK动态代理################");

Object result = null;

//反射方法前调用

System.err.println("我准备说hello。");

//反射执行方法 相当于调用target.sayHelllo;

result=method.invoke(target, args);

//反射方法后调用.

System.err.println("我说过hello了");

return result;

}

}

要想了解Java 动态代理,你要学会这些!

其中,bind方法中的newProxyInstanc方法,就是生成一个代理对象,第一个参数是类加载器,第二个参数是真实委托对象所实现的的接口(代理对象挂在那个接口下),第三个参数this代表当前HelloServiceProxy类,换句话说是使用HelloServiceProxy作为对象的代理。

尚学堂12大精英团队+各类实战项目,真正实现1+1>10的目标效果。帮助学员迅速成长,持久腾飞,成就学员“高富帅”人生;帮助企业技术和团队成长,成就百年中华名企;助力中国持续成为世界强国而贡献力量。尚学堂12大精英团队,覆盖IT行业十大领域,实战团队240人,服务学员累计超过10万人,就业合作企业数量500+。


分享到:


相關文章: