JDK动态代理是借助java.lang.reflect.*包提供的方式,它必须借助一个接口才能产生代理对象。
public interface HelloWorld {
public void sayHelloWorld();
}
public class HelloWorldImpl implements HelloWorld {
@Override
public void sayHelloWorld() {
System.out.println("Hello World");
}
}
动态代理的实现基本需要两步:
代理对象和真实对象的关系绑定和代理逻辑的实现。
代理对象和真实对象的绑定需要Proxy类中的newProxyInstance方法。
代理逻辑的实现需要重写InvocationHandler中的invoke方法。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class JDKProxyExample implements InvocationHandler {
//定义一个真实对象
private Object target = null;
/**
* JDK动态代理是由 java.lang.reflect.*包提供的方式,
* 需要借助接口才能代理对象。(借助HelloWorld接口代理HelloWorldImpl对象)
*
*
* 要实现代理逻辑首先要建立代理对象和真实对象的关系(Proxy类)
*
* 首先通过bind方法建立代理对象和真实对象的关系
*/
/**
* Proxy类提供静态方法生成动态代理对象,其中提供许多方法
* 常用 newProxyInstance方法,
* 第一个参数为 真实对象的类加载器
*
* 第二个参数为 生成的动态对象下挂到哪些接口,
* 本例中将代理对象下挂到真实对象实现的接口HelloWorld接口下。
* 代理对象可以这样声明 : HelloWorld proxy;
*
* 第三个参数为 实现方法调度的代理类的对象(InvocationHandle的实现类的对象),
* 这个类必须实现InvocationHandle接口的invoke方法
* 这个方法就是代理逻辑方法的实现方法。
*/
/**
* @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 代理结果返回
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("进入代理逻辑方法");
System.out.println("在调度真实对象之前服务");
Object obj = new Object();
method.invoke(target, args);//反射调用
System.out.println("在调度真是对象之后服务");
return obj;
}
public void testJdkProxy(){
JDKProxyExample jdk = new JDKProxyExample();
//绑定关系,接口回调声明方式
HelloWorld proxy = (HelloWorld) jdk.bind(new HelloWorldImpl());
//此时proxy为代理对象,它会进入代理方法,而不是实现类的方法
proxy.sayHelloWorld();
}
public static void main(String[] args) {
JDKProxyExample ex = new JDKProxyExample();
ex.testJdkProxy();
}
}
当执行proxy.sayHelloWorld()时,调用的为invoke方法,在invoke方法中通过反射调用了sayHelloWorld方法。在代理模式中的invoke方法
可以进行其他的一些操作。