- 浏览: 101499 次
- 性别:
- 来自: 武汉
-
最新评论
-
zljerityzljerity:
<#assign ipage=page?number&g ...
freeMark全解 -
qiankai86:
...
freeMark全解
Java Proxy代理类的理解
关键字: java proxy
在Java中利用代理(Proxy)可以在运行时创建一个实现了一组给定接口的新类。
在系统程序设计中,有时需要面对无法确定接口,却需要构造对象的情况。以前为了解决此问题,有些程序根据动态确定的接口,生成Java类文件,然后调用类加载器构造该对象,然后使用,这样一来无可避免性能问题。通过代理类,能够在不额外创建Java文件的情况下构造对象及调用该对象方法。
使用代理的理由有很多,其中就有如下的情况:
1.路由对远程服务器的方法调用
2.在程序运行期间,将用户接口事件与行动关联起来
3.调试时跟踪方法调用
以下举出一例,使用代理和调用处理器跟踪方法调用
- 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;
- }
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,则代理类就不属于某个特定的包;否则所有的非公有接口都必须属于同一个包,代理类也属于这个包(此设定的目的是确定代理类的所属包)
发表评论
-
ofbiz 之entity实体
2014-03-25 18:16 955ofbiz 之entity实体 1. 实体定义文件 实体定 ... -
ofbiz迷你语言
2012-08-08 17:13 2310simple-map-processor 和 sim ... -
ofbiz之entity 实体解析
2012-08-08 17:12 1525ofbiz 之entity实体 1. 实体定义文件 实体定 ... -
ofbiz之旅-实体简介(中英译)
2012-08-09 09:34 1183OFBIZ ENTITY ENGINE COOKBOOK = ... -
OFBIz之旅[结构]
2012-08-08 17:03 1505OFBIz之旅[结构] 注意: 1,持久层,在OFBI ... -
java concurrent 探秘(2)
2011-08-08 14:21 927java concurrent 探秘(2) Blo ... -
java concurrent 探秘
2011-08-08 11:02 828java concurrent 探秘 我们都知道,在JD ... -
one-to-one 一对一主键关联映射_单向
2011-08-03 17:22 1337one-to-one 一对一主键关联映射_单向 一对一主键关 ... -
JavaScript验证正则表达式大全
2011-07-27 17:18 934上篇文章《JavaScript验证正则表达式大全》说的是jav ... -
JavaScript验证正则表达式大全
2011-07-27 17:17 842JavaScript验证正则表达式大全 JavaScript验 ... -
js 收集1
2011-01-14 09:49 10741.javascript的数组API Js代码 ... -
struts 核心解析
2010-12-03 14:25 2467一、概述 Struts2的核心是一个Fil ... -
Java类库中的集合类解析
2010-11-29 16:05 1098这篇我准备从源码的高度来看看集合中各个实现类的是如何组织我们存 ... -
jboss classloader机制以及scope配置
2010-11-29 15:06 17261. 概念介绍 UCL : org.jboss.mx. ... -
总结和对比一下(jboss,tomcat,jetty)容器的classloader机制
2010-11-29 14:58 1999总结和对比一下(jboss,tomcat,je ... -
jboss,tomcat,jetty 容器的classloader机制
2010-11-29 14:53 4602背景 前段时间一直在做应用容器的迁移,将公司的应用 ... -
Session,Cookie,jsessionid和Url重写
2010-11-29 12:55 1940Session,Cookie,jsessionid ... -
DWR work
2010-11-25 18:14 902这段时间较闲,研究了一 ... -
CXF jaxws spring configuration
2010-11-19 16:27 1608最近在cxf-zh中有人问及了有关Spring配置CXF Cl ... -
线程安全总结2
2010-11-17 16:48 830站内很多人都问我,所谓线程的“工作内存”到底是个什么东西? ...
相关推荐
在Java中,动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。Proxy类是用于创建一个代理对象,而InvocationHandler接口则定义了代理对象调用方法时的行为。 1. **...
Java ProxyServer是一个基于Java实现的代理服务器类,它在客户端和服务器之间起到了中继的作用,允许数据在两者间传输。代理服务器在计算机网络中的主要功能是提供代理服务,它可以隐藏客户端的真实身份,增加网络...
总结来说,"proxy.rar"压缩包提供了Java编程中三种代理模式的源代码实例,通过学习这些代码,开发者可以深入理解代理模式的原理和实现,同时掌握泛型在实际项目中的应用。对于提高代码的可扩展性和可维护性,这些都...
在Java中,静态代理是通过定义一个与被代理类实现相同接口的新类来实现的,而动态代理则在运行时动态生成此类,无需预先编写代理类的代码。 `java.lang.reflect.Proxy`类是Java动态代理的核心,它提供了创建代理...
在这个主题“代理模式java代码 Proxy(5) 2个代理类”中,我们可以理解为将介绍两种不同的代理类实现。 1. 静态代理 在静态代理中,我们需要创建一个接口,然后让目标对象和代理对象都实现这个接口。代理类会持有...
1. **Socket编程**:Java的`java.net.Socket`和`java.net.ServerSocket`类是构建代理服务器的基础。`ServerSocket`用于监听特定端口上的连接请求,而`Socket`则用于建立客户端与代理服务器之间的连接。 2. **HTTP...
首先,`java.lang.reflect.Proxy`是Java标准库中用于生成动态代理类的关键类。它允许我们创建一个新的接口实现类,而无需手动编写具体实现。这个新创建的代理类在运行时动态生成,并且在调用接口方法时,可以插入...
Java的Proxy机制是Java反射API的一部分,主要用于创建动态代理类和动态代理对象。它允许我们在运行时创建一个实现了特定接口的新类,这个新类的行为由我们提供的InvocationHandler对象控制。以下是对Java Proxy机制...
在标题“JavaProxy Demo”中提到的,这是一个展示Java动态代理功能的示例程序。动态代理通常用于实现AOP(面向切面编程)或者在不修改目标对象的情况下增加额外的功能,比如日志、事务管理、性能监控等。 在Java中...
1. **代理类(Proxy Class)**:代理类是目标对象的代理,它实现了与目标对象相同的接口,使得客户端可以通过代理类调用目标对象的方法,同时在调用前后可以添加额外的操作。 2. **目标类(Target Class)**:代理类...
接下来,我们创建了一个代理类`BusinessProcessorHandler`,实现了`InvocationHandler`接口。`InvocationHandler`接口中的`invoke()`方法是关键,它会在代理对象的方法被调用时执行。在这个例子中,`invoke()`方法在...
本文将详细介绍如何在Java中使用IE Proxy代理来实现这一功能。 首先,我们需要理解Java中的网络访问机制。Java使用`java.net`包中的`Socket`和`HttpURLConnection`等类来处理网络通信。当程序运行时,它会使用系统...
Java动态代理是一种在运行时动态生成代理类的技术,通过该技术可以为一个或多个接口生成一个实现类,该实现类可以拦截接口方法的调用,并进行额外的操作。Java动态代理主要由`java.lang.reflect.Proxy`类和`java....
Java动态代理类位于`java.lang.reflect`包下,主要包括`InvocationHandler`接口和`Proxy`类。 **2. `InvocationHandler`接口** - **定义:** `InvocationHandler`接口定义了一个`invoke`方法,该方法用于处理代理...
在Java中,静态代理是通过在代理类中显式实现目标接口来实现的。下面将详细介绍静态代理模式的概念、作用、实现方式以及其优缺点。 ### 1. 静态代理概念 静态代理模式是一种结构型设计模式,其核心思想是通过创建一...
Java动态代理基于Java反射机制,可以在运行时动态地创建代理类和代理对象。与静态代理(即手动编写代理类)相比,动态代理无需预先为每个接口编写单独的代理类,使得代码更加灵活且易于维护。 2. **代理接口** 在...
当我们调用`Proxy.newProxyInstance()`方法时,Java会根据传入的接口列表动态生成一个实现了这些接口的代理类的字节码,然后加载这个类。代理类的对象会在调用接口方法时,转而调用`InvocationHandler`的`invoke()`...
总的来说,"httpProxy-java"项目涉及的是使用Java实现HTTP代理服务的技术,涵盖了网络编程、HTTP协议、多线程以及可能的额外功能如性能优化和安全控制。通过对这些项目的研究和学习,开发者可以深入理解HTTP代理的...
静态代理是通过创建一个代理类来实现对目标对象的代理,这个代理类和目标类具有相同的接口,代理类在调用目标对象方法时可以加入一些额外的操作。例如,在`ImageProxy.java`中,可能存在一个`Image`接口和一个实现了...
1. `java.lang.reflect.Proxy`:这个类是Java动态代理的基石,提供了生成代理类和实例的方法。`newProxyInstance()`方法是关键,它接受类加载器、接口列表和一个实现了`InvocationHandler`的实例作为参数,返回代理...