[关闭]
@Cesar 2016-01-07T10:04:27.000000Z 字数 1990 阅读 1233

Java中的动态代理

Java

目录

  1. 创建接口
  2. 实现接口
  3. 实现代理
  4. 测试

创建接口

  1. // 创建一个接口,名字叫Resource
  2. package test0107;
  3. public interface Resource {
  4. public void operationA();
  5. public void operationB();
  6. }

实现接口

  1. // Resource接口的实现
  2. package test0107;
  3. public class ConcreateResource implements Resource{
  4. public ConcreateResource() {
  5. System.out.println("创建了一个ConcreateResource的对象");
  6. }
  7. @Override
  8. public void operationA() {
  9. System.out.println("Operaation A");
  10. }
  11. @Override
  12. public void operationB() {
  13. System.out.println("Operation B");
  14. }
  15. }

实现代理

  1. package test0107;
  2. import java.lang.reflect.InvocationHandler;
  3. import java.lang.reflect.Method;
  4. import java.lang.reflect.Proxy;
  5. public class DynamicProxy implements InvocationHandler {
  6. private Resource resource;
  7. public DynamicProxy() {
  8. }
  9. @Override
  10. public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
  11. //在方法调用时创建对象
  12. if(resource==null){
  13. resource = new ConcreateResource();
  14. System.out.println("初始化");
  15. }
  16. if (method.getName().equals("operationA")) {
  17. System.out.println("OperationA in Proxy");
  18. }
  19. return method.invoke(resource, args);//执行方法;
  20. }
  21. //创建一个绑定了该代理对象的虚拟的Resource,此时并未创建实际的对象
  22. public Resource create() {
  23. Resource resource = null;
  24. resource = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(), new Class[] { Resource.class },
  25. this);//绑定
  26. return resource;
  27. }
  28. }

测试

  1. package test0107;
  2. import java.lang.reflect.Proxy;
  3. public class TestProxy {
  4. public static void main(String[] args) {
  5. //第一种测试,使用Create方法创建resource对象,在调用时创建该对象的实例
  6. DynamicProxy dynamicProxy = new DynamicProxy();
  7. Resource resource = dynamicProxy.create();//绑定,此时对象没有创建
  8. System.out.println("此时对象未创建");
  9. resource.operationA();
  10. resource.operationB();
  11. Resource resource2 = (Resource) Proxy.newProxyInstance(Resource.class.getClassLoader(),new Class[]{Resource.class}, dynamicProxy); //在测试类中绑定
  12. resource2.operationA();
  13. resource2.operationB();
  14. }
  15. }

结果如下:

此时对象未创建
创建了一个ConcreateResource的对象
初始化
OperationA in Proxy
Operaation A
Operation B
OperationA in Proxy
Operaation A
Operation B

分析:
1. 先输出“此时对象未创建”说明在使用代理绑定Resource对象的时候并没有创建该对象的实例,只是返回了一个可以调用的接口
2. 输出“创建了一个ConcreateResource的对象”和“初始化”说明在调用方法的时候创建了该对象的实例
3. 接下来的输出即说明绑定了代理的对象在每一次调用方法的时候都是在执行绑定的代理实例的invoke方法,如此,代理模式就完成了。

通过这种动态代理,可以实现在调用某些方法前实现我们想要的操作。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注