jdk代理模式通过继承Invocationhandler接口来实现
创建一个接口
package cn.quangaoleng;
public interface HelloWorld {
public void sayHello();
}
实现这个接口
package cn.quangaoleng;
public class HelloWorldImple implements HelloWorld{
@Override
public void sayHello() {
System.out.println("Hello World!");
}
}
实现Invocation接口来写一个可以实现jdk动态代理的类
package cn.quangaoleng;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JdkProxyExample implements InvocationHandler{
//真是对象
private Object target = null;
/**
* 建立对象和真实对象之间的关系,并返回真实对象
* @param target 真实对象
* @return 返回代理对象
*/
public Object bind(Object target){
this.target= target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
/**
* 代理方法逻辑
* @param proxy 代理对象
* @param method 当前调度方法
* @param args 方法执行参数
* @return 返回执行结果
* @throws Throwable 异常
*/
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("进入方法逻辑");
System.out.println("执行方法前");
Object object = method.invoke(target,args);
System.out.println("执行方法后");
return object;
}
}
进行测试
package cn.quangaoleng;
import org.junit.Test;
public class TestJdkProxy {
@Test
public void testJdkProxy(){
JdkProxyExample example = new JdkProxyExample();
HelloWorld h = (HelloWorld) example.bind(new HelloWorldImple());
h.sayHello();
}
}
我们通过 Object object =method.invoke(target,args);
这句可以看出其实实现功能的还是真实的对象,我们进行绑定时,方法返回一个代理对象,当用这个代理对象执行方法时,用于绑定真实对象的jdk动态代理类将执行invoke方法,将要执行的方法,方法参数,代理对象,真实对象作为参数,利用反射去执行真实对象的method