创建接口
// 创建一个接口,名字叫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对象的时候并没有创建该对象的实例,只是返回了一个可以调用的接口
输出“创建了一个ConcreateResource的对象”和“初始化”说明在调用方法的时候创建了该对象的实例
接下来的输出即说明绑定了代理的对象在每一次调用方法的时候都是在执行绑定的代理实例的
invoke
方法,如此,代理模式就完成了。
通过这种动态代理,可以实现在调用某些方法前实现我们想要的操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。