JDK动态代理的理论:
1.编写服务类和服务接口,这是真正的服务方法提供者,在JDK代理中接口是必须的
2.编写代理类,提供绑定和代理方法。现在我们写一个代理类,提供真实的对象绑定和代理方法。代理类的要求实现InvocationHandler接口的代理方法(invoke),当一个对象呗绑定后,执行其方法的时候就会进入到代理方法里。
JDK动态代理的原理:
1.JDK产生了一个代理对象,这个代理对象有三个参数:第一个参数target.getClass().getClassLoader()是类加载器,第二个参数target.getClass().getInterfaces()是接口,第三个参数this代表当前的HelloServiceProxy类,换句话说使用HelloServiceProxy的代理方法作为对象的代理执行者。
2.一旦绑定后,在进入代理对象方法的调用的时候会进入HelloServiceProxy的代理方法上,代理方法有三个参数:第一个参数proxy是代理对象,第二个参数当前调用的方法,第三个参数是方法的参数。比如说现在吧HelloServiceImpl对象(Obj)用bind方法绑定后,返回其占位,我们在调用Proxy.sayHello("张三"),那么它就会进入到HelloServiceProxy的invoke参数中第一个便是代理对象Proxy,方法便是SayHello,参数张三
服务接口代码:
public interface HelloService{
public void sayHello(String name);
}
服务类代码:
public Class HelloServiceImpl implements HelloService{
public void sayHello(String name){
Sysout(“Hello ”+name);
}
代理类代码(实现InVocationHandler的代理方法invoke):
public Class HelloServiceProxy implements InVocationHandler{
private Object target;
//绑定代理类方法
public Object bind(Object target){
this.target = target;
return Proxy.new ProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
Sysout("###########JDK动态代理#############")
Object result = null;
Sysout("我准备开始说hello");
result = method.invoke(target,args);
Sysout("我说过hello");
return result;
}
}
测试main方法代码:
public Class HelloServiceMain{
public static void main(String[] args){
//JDK动态代理实现调用接口方法
HelloServiceProxy hellHandler = new HelloServiceProxy();
HelloService proxy = (HelloService) helloHandler.bind(new HelloSerivceImpl());
proxy.sqyHello("李白");
//一般的调用服务类方法
Sysout("--------------------------------");
HelloServiceImple proxyImpl = new HelloSerivceImpl();
proxyImpl .sqyHello("李白");
}
}
输出结果:
###########JDK动态代理#############
我准备开始说hello
Hello 李白
我说过hello
--------------------------------------------------------------
Hello 李白