JDK动态代理

来源:互联网 发布:led灯 知乎 编辑:程序博客网 时间:2024/06/01 20:03

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 李白

Sysout("我准备开始说hello");
原创粉丝点击