JDK动态代理的实现

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方法
可以进行其他的一些操作。




你可能感兴趣的:(JDK动态代理的实现)