动态代理在各大框架中用的十分的频繁,
本文主要介绍通过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;
}
}
运行测试方法:
@Test
public void test() {
HelloServiceProxy helloHandler = new HelloServiceProxy();
HelloService proxy = (HelloService) helloHandler.bind(new HelloServiceImpl());
proxy.sayHello("Tom");
}
即可看见通过代理后,然后绑定执行HelloServiceImpl的方法。
赠人玫瑰,手留余香~~