// 建立一个接口,名字叫Resource public interface Resource { public void operationA(); public void operationB(); }
// Resource接口的实现 public class ConcreateResource implements Resource{ public ConcreateResource() { System.out.println("建立了一个ConcreateResource的对象"); } @Override public void operationA() { System.out.println("Operaation A"); } @Override public void operationB() { System.out.println("Operation B"); } }
import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; public class DynamicProxy implements InvocationHandler { private Resource resource; public DynamicProxy() { } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //在方法调用时建立对象 if(resource==null){ resource = new ConcreateResource(); System.out.println("初始化"); } if (method.getName().equals("operationA")) { System.out.println("OperationA in Proxy"); } return method.invoke(resource, args);//执行方法; } //建立一个绑定了该代理对象的虚拟的Resource,此时并未建立实际的对象 public Resource create() { Resource resource = null; resource = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(), new Class[] { Resource.class }, this);//绑定 return resource; } }
package test0107; import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args) { //第一种测试,使用Create方法建立resource对象,在调用时建立该对象的实例 DynamicProxy dynamicProxy = new DynamicProxy(); Resource resource = dynamicProxy.create();//绑定,此时对象没有建立 System.out.println("此时对象未建立"); resource.operationA(); resource.operationB(); Resource resource2 = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(),new Class[]{Resource.class}, dynamicProxy); //在测试类中绑定 resource2.operationA(); resource2.operationB(); } } /* 结果以下: 此时对象未建立 建立了一个ConcreateResource的对象 初始化 OperationA in Proxy Operaation A Operation B OperationA in Proxy Operaation A Operation B */
先输出“此时对象未建立”说明在使用代理绑定Resource对象的时候并无建立该对象的实例,只是返回了一个能够调用的接口java
输出“建立了一个ConcreateResource的对象”和“初始化”说明在调用方法的时候建立了该对象的实例ide
接下来的输出即说明绑定了代理的对象在每一次调用方法的时候都是在执行绑定的代理实例的invoke
方法,如此,代理模式就完成了。测试
经过这种动态代理,能够实如今调用某些方法前实现咱们想要的操做。this