`
talentkep
  • 浏览: 101492 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Java Proxy代理类的理解

    博客分类:
阅读更多

Java Proxy代理类的理解

关键字: java proxy

    在Java中利用代理(Proxy)可以在运行时创建一个实现了一组给定接口的新类。

 

     在系统程序设计中,有时需要面对无法确定接口,却需要构造对象的情况。以前为了解决此问题,有些程序根据动态确定的接口,生成Java类文件,然后调用类加载器构造该对象,然后使用,这样一来无可避免性能问题。通过代理类,能够在不额外创建Java文件的情况下构造对象及调用该对象方法。

 

    使用代理的理由有很多,其中就有如下的情况:

    1.路由对远程服务器的方法调用

    2.在程序运行期间,将用户接口事件与行动关联起来

    3.调试时跟踪方法调用

 

     以下举出一例,使用代理和调用处理器跟踪方法调用

 

 

Java代码 复制代码
  1. import java.lang.reflect.InvocationHandler;   
  2. import java.lang.reflect.Method;   
  3. import java.lang.reflect.Proxy;   
  4. import java.util.Arrays;   
  5. import java.util.Random;   
  6.   
  7. public class ProxyTest   
  8. {     
  9.    public static void main(String[] args)   
  10.    {     
  11.       Object[] elements = new Object[1000];   
  12.   
  13.       // fill elements with proxies for the integers 1 ... 1000   
  14.       for (int i = 0; i < elements.length; i++)   
  15.       {   
  16.          Integer value = i + 1;   
  17.          Class[] interfaces = value.getClass().getInterfaces();   
  18.          InvocationHandler handler = new TraceHandler(value);   
  19.          Object proxy = Proxy.newProxyInstance(null,   
  20.             interfaces, handler);   
  21.          elements[i] = proxy;   
  22.       }   
  23.   
  24.       // construct a random integer   
  25.       Integer key = new Random().nextInt(elements.length) + 1;   
  26.   
  27.       // search for the key   
  28.       int result = Arrays.binarySearch(elements, key);   
  29.   
  30.       // print match if found   
  31.       if (result >= 0) System.out.println(elements[result]);   
  32.    }   
  33. }   
  34.   
  35. /**  
  36.    An invocation handler that prints out the method name  
  37.    and parameters, then invokes the original method  
  38. */  
  39. class TraceHandler implements InvocationHandler   
  40. {    
  41.    /**  
  42.       Constructs a TraceHandler  
  43.       @param t the implicit parameter of the method call  
  44.    */  
  45.    public TraceHandler(Object t)   
  46.    {     
  47.       target = t;   
  48.    }   
  49.   
  50.    public Object invoke(Object proxy, Method m, Object[] args) throws Throwable//此方法在代理类中   
  51.    {                                                           //的方法被调用时均会被调用   
  52.       // print implicit argument   
  53.       System.out.print(target);   
  54.       // print method name   
  55.       System.out.print("." + m.getName() + "(");   
  56.       // print explicit arguments   
  57.       if (args != null)   
  58.       {   
  59.          for (int i = 0; i < args.length; i++)   
  60.          {     
  61.             System.out.print(args[i]);   
  62.             if (i < args.length - 1)   
  63.                System.out.print(", ");   
  64.          }   
  65.       }   
  66.       System.out.println(")");   
  67.   
  68.       // invoke actual method   
  69. //      return new Integer("123");   
  70.       return m.invoke(target, args);   
  71.    }   
  72.   
  73.    private Object target;   
  74. }  
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Arrays;
import java.util.Random;

public class ProxyTest
{  
   public static void main(String[] args)
   {  
      Object[] elements = new Object[1000];

      // fill elements with proxies for the integers 1 ... 1000
      for (int i = 0; i < elements.length; i++)
      {
         Integer value = i + 1;
         Class[] interfaces = value.getClass().getInterfaces();
         InvocationHandler handler = new TraceHandler(value);
         Object proxy = Proxy.newProxyInstance(null,
            interfaces, handler);
         elements[i] = proxy;
      }

      // construct a random integer
      Integer key = new Random().nextInt(elements.length) + 1;

      // search for the key
      int result = Arrays.binarySearch(elements, key);

      // print match if found
      if (result >= 0) System.out.println(elements[result]);
   }
}

/**
   An invocation handler that prints out the method name
   and parameters, then invokes the original method
*/
class TraceHandler implements InvocationHandler
{ 
   /**
      Constructs a TraceHandler
      @param t the implicit parameter of the method call
   */
   public TraceHandler(Object t)
   {  
      target = t;
   }

   public Object invoke(Object proxy, Method m, Object[] args) throws Throwable//此方法在代理类中
   {  														   //的方法被调用时均会被调用
      // print implicit argument
      System.out.print(target);
      // print method name
      System.out.print("." + m.getName() + "(");
      // print explicit arguments
      if (args != null)
      {
         for (int i = 0; i < args.length; i++)
         {  
            System.out.print(args[i]);
            if (i < args.length - 1)
               System.out.print(", ");
         }
      }
      System.out.println(")");

      // invoke actual method
//      return new Integer("123");
      return m.invoke(target, args);
   }

   private Object target;
}

  在此处,代理类取代了可能需要额外创建的Java文件。

 

   当调用代理类的方法时,调用实现InvocationHandler接口的方法invoke,此时可以针对传入参数Method的不同,定义不同的方法体(操作)

 

   Proxy类的特性:

   1.代理(Proxy)类只有一个实例变量,即调用处理器(InvocationHandler)

   2.代理类需要的额外数据都必须存储在调用处理器中

   3.代理类一定是public和final.

   4.如果代理类实现的所有接口都是public,则代理类就不属于某个特定的包;否则所有的非公有接口都必须属于同一个包,代理类也属于这个包(此设定的目的是确定代理类的所属包)

分享到:
评论

相关推荐

    java Proxy 动态代理

    在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...

    Java_ProxyServer.rar_Java ProxyServer_java proxy server

    Java ProxyServer是一个基于Java实现的代理服务器类,它在客户端和服务器之间起到了中继的作用,允许数据在两者间传输。代理服务器在计算机网络中的主要功能是提供代理服务,它可以隐藏客户端的真实身份,增加网络...

    proxy.rar java三种代理模式源码

    总结来说,"proxy.rar"压缩包提供了Java编程中三种代理模式的源代码实例,通过学习这些代码,开发者可以深入理解代理模式的原理和实现,同时掌握泛型在实际项目中的应用。对于提高代码的可扩展性和可维护性,这些都...

    java动态代理类的实例

    在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...

    代理模式java代码 Proxy(5) 2个代理类

    在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...

    java 实现HTTP PROXY

    1. **Socket编程**:Java的`java.net.Socket`和`java.net.ServerSocket`类是构建代理服务器的基础。`ServerSocket`用于监听特定端口上的连接请求,而`Socket`则用于建立客户端与代理服务器之间的连接。 2. **HTTP...

    Java动态代理[动态类Proxy的使用]

    首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写具体实现。这个新创建的代理类在运行时动态生成,并且在调用接口方法时,可以插入...

    深入理解Java Proxy机制.doc

    Java的Proxy机制是Java反射API的一部分,主要用于创建动态代理类和动态代理对象。它允许我们在运行时创建一个实现了特定接口的新类,这个新类的行为由我们提供的InvocationHandler对象控制。以下是对Java Proxy机制...

    JavaProxy Demo

    在标题“JavaProxy Demo”中提到的,这是一个展示Java动态代理功能的示例程序。动态代理通常用于实现AOP(面向切面编程)或者在不修改目标对象的情况下增加额外的功能,比如日志、事务管理、性能监控等。 在Java中...

    从房屋买卖看 java proxy 模式

    1. **代理类(Proxy Class)**:代理类是目标对象的代理,它实现了与目标对象相同的接口,使得客户端可以通过代理类调用目标对象的方法,同时在调用前后可以添加额外的操作。 2. **目标类(Target Class)**:代理类...

    深入理解JavaProxy机制.doc

    接下来,我们创建了一个代理类`BusinessProcessorHandler`,实现了`InvocationHandler`接口。`InvocationHandler`接口中的`invoke()`方法是关键,它会在代理对象的方法被调用时执行。在这个例子中,`invoke()`方法在...

    Java中使用IE Proxy代理的方法

    本文将详细介绍如何在Java中使用IE Proxy代理来实现这一功能。 首先,我们需要理解Java中的网络访问机制。Java使用`java.net`包中的`Socket`和`HttpURLConnection`等类来处理网络通信。当程序运行时,它会使用系统...

    Java 动态代理Proxy应用和底层源码分析.pdf

    Java动态代理是一种在运行时动态生成代理类的技术,通过该技术可以为一个或多个接口生成一个实现类,该实现类可以拦截接口方法的调用,并进行额外的操作。Java动态代理主要由`java.lang.reflect.Proxy`类和`java....

    Java代理模式Java动态代理

    Java动态代理类位于`java.lang.reflect`包下,主要包括`InvocationHandler`接口和`Proxy`类。 **2. `InvocationHandler`接口** - **定义:** `InvocationHandler`接口定义了一个`invoke`方法,该方法用于处理代理...

    Java 静态代理模式

    在Java中,静态代理是通过在代理类中显式实现目标接口来实现的。下面将详细介绍静态代理模式的概念、作用、实现方式以及其优缺点。 ### 1. 静态代理概念 静态代理模式是一种结构型设计模式,其核心思想是通过创建一...

    java动态代理demo

    Java动态代理基于Java反射机制,可以在运行时动态地创建代理类和代理对象。与静态代理(即手动编写代理类)相比,动态代理无需预先为每个接口编写单独的代理类,使得代码更加灵活且易于维护。 2. **代理接口** 在...

    Java动态代理ReflectProxyDemo

    当我们调用`Proxy.newProxyInstance()`方法时,Java会根据传入的接口列表动态生成一个实现了这些接口的代理类的字节码,然后加载这个类。代理类的对象会在调用接口方法时,转而调用`InvocationHandler`的`invoke()`...

    httpProxy-java

    总的来说,"httpProxy-java"项目涉及的是使用Java实现HTTP代理服务的技术,涵盖了网络编程、HTTP协议、多线程以及可能的额外功能如性能优化和安全控制。通过对这些项目的研究和学习,开发者可以深入理解HTTP代理的...

    代理模式java代码 Proxy(1)

    静态代理是通过创建一个代理类来实现对目标对象的代理,这个代理类和目标类具有相同的接口,代理类在调用目标对象方法时可以加入一些额外的操作。例如,在`ImageProxy.java`中,可能存在一个`Image`接口和一个实现了...

    java动态代理实现详解

    1. `java.lang.reflect.Proxy`:这个类是Java动态代理的基石,提供了生成代理类和实例的方法。`newProxyInstance()`方法是关键,它接受类加载器、接口列表和一个实现了`InvocationHandler`的实例作为参数,返回代理...

Global site tag (gtag.js) - Google Analytics