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!\");
	}
}

以上就是最简单的接口和实现类的关系,现在可以开始代理了。要实现代理需要分两个步骤:

  1. 建立代理对象和真实服务对象的关系
  2. 实现代理逻辑
    在JDK的动态代理中,要实现代理逻辑类必须实现java.lang.reflect.InvocationHandler接口,这个接口中定义了一个invoke()方法,并提供了接口数组来挂载代理对象:
public class JdkProxyExample implements InvocationHandler{
	private   target = null;
	
	public   bind(  target) {
		this.target = target;
		return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
		
	}
	
	@Override
	public   invoke(  proxy, Method method,  [] args) throws Throwable {
		System.out.println(\"进入代理方法\");
		System.out.println(\"调用真实方法之前。。。\");
		    = method.invoke(target, args);
		System.out.println(\"调用真实方法之后。。。\");
		return  ;
	}
	
	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的动态代理。

收藏 打印