JDK动态代理的实践

来源:互联网 发布:俄罗斯域名后缀 编辑:程序博客网 时间:2024/06/01 08:37

动态代理在各大框架中用的十分的频繁,

本文主要介绍通过JDK来实现动态代理的机制。

对代理不理解?

可以参看我的设计模式这一篇:代理模式-让替身帮你区干事

我们需要完成下面几个步骤:

1、编写服务类和接口,这个是真正的服务提供商,在JDK代理中,接口是必须的。

2、编写代理类,提供绑定和代理方法。


具体代码:

首先一个接口类HelloService类:

package study.JDKProxy;public interface HelloService {public void sayHello(String name);}

再一个具体实现类HelloServiceImpl类:

package study.JDKProxy;public class HelloServiceImpl implements HelloService{public void sayHello(String name) {System.out.println("Hello" + name);}}

接下来就是一个代理类HelloServiceProxy类:

package study.JDKProxy;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;import java.net.BindException;/** * 一个代理类,提供真实对象的绑定和代理方法,代理 * 类的要求是实现invocationhandler接口的代理方法 * 当一个对象被绑定后,执行器方法就会进去到代理方法里面 * @author anla7856 * */public class HelloServiceProxy implements InvocationHandler{/** * 真实服务对象 */private Object target;/** * 绑定委托对象并返回一个代理类 * @param target * @return */public Object bind(Object target) {this.target = target;//取得代理对象,jdk代理需要提供接口。return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);}/** * @param proxy 代理对象唉嗯 * @param method 被调用方法 * @param args 方法的参数 */public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("这是jdk动态代理");Object result = null;//反射方法调用前result = method.invoke(target, args);//反射方法调用后return result;}}

运行测试方法:

@Testpublic void test() {HelloServiceProxy helloHandler = new HelloServiceProxy();HelloService proxy = (HelloService) helloHandler.bind(new HelloServiceImpl());proxy.sayHello("Tom");}

即可看见通过代理后,然后绑定执行HelloServiceImpl的方法。


赠人玫瑰,手留余香~~






原创粉丝点击