jdk动态代理是java.lang.reflect.*包提供的方式,必须接住接口才能产生代理对象,所以需要先创建一个接口:
public interface HelloWorld{
public void sayHelloWorld();
}
再提供HelloWorldImpl来实现这个接口:
public class HelloWorldImpl implements HelloWorld {
@Override
public void sayHelloWorld() {
System.out.println("Hello World!");
}
}
以上就是最简单的接口和实现类的关系,现在可以开始代理了。要实现代理需要分两个步骤:
- 建立代理对象和真实服务对象的关系
- 实现代理逻辑
在JDK的动态代理中,要实现代理逻辑类必须实现java.lang.reflect.InvocationHandler接口,这个接口中定义了一个invoke()方法,并提供了接口数组来挂载代理对象:
public class JdkProxyExample implements InvocationHandler{
private Object target = null;
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
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;
}
public void testJdkProxy() {
JdkProxyExample jdkProxyExample = new JdkProxyExample();
HelloWorld proxy = (HelloWorld) jdkProxyExample.bind(new HelloWorldImpl());
proxy.sayHelloWorld();
}
public static void main(String[] args) {
JdkProxyExample example = new JdkProxyExample();
example.testJdkProxy();
}
}
接下来测试一下代理逻辑的调用:
public void testJdkProxy() {
JdkProxyExample jdkProxyExample = new JdkProxyExample();
HelloWorld proxy = (HelloWorld) jdkProxyExample.bind(new HelloWorldImpl());
proxy.sayHelloWorld();
}
此时,在调用打印Hello World
前后都可以加入其他逻辑,即实现了JDK的动态代理。