`

Java proxy

    博客分类:
  • J2SE
 
阅读更多

Java proxy

 

proxy, a design pattern base on reflect, it handle method invocation on object with a proxy instance,

 

------

class & interface

 

include:

* java.lang.reflect.Proxy

help to create proxy instance,

* java.lang.reflect.InvocationHandler

implement it to specify the proxy logic,

 

------

create & use a proxy

 

steps:

* pre-step:

* create the proxyed interface

* create the proxyed class implements the proxyed interface

* create a class implement InvocateHandler,

do:

* provide a field which is the proxyed object,

* provide a bind method(e.g. bind()), pass the proxyed object as param, and call Proxy.newProxyInstance() to create & return a proxy instance,

* implement the invoke() method, it call the method and return the return value, also do some other logic as you wish,

* get proxy instance

create an instance of the class that implement InvocateHandler,

and call the bind method with a proxyed object as param, to get a proxy instance,

cast the proxy instance to type that is one of the proxyed object's interface,

* call method with proxy instance

just the same as call on the proxyed object,

 

------

proxy & interface

 

proxy instance must be cast to an interface type, but not the class itself or it's superclass,

and all method to be invode via proxy, must be declared in the interface,

 

this is because Proxy.newProxyInstance's second param accept only interface, typically we use Class.getInterfaces() to pass the param,


------

code


IHello.java

 

package eric.j2se.proxy;

/**
 * interface for proxyed class
 * 
 * @author eric
 * @date Dec 7, 2012 6:07:36 PM
 */
public interface IHello {
	public void hello(String name);
}
 

 

Hello.java

 

package eric.j2se.proxy;

/**
 * proxyed class
 * 
 * @author eric
 * @date Dec 7, 2012 6:07:49 PM
 */
public class Hello implements IHello {
	@Override
	public void hello(String name) {
		System.out.printf("hello, %s!\n", name);
	}
}
 

 

TimerProxy.java

 

package eric.j2se.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

import org.apache.log4j.Logger;

/**
 * a proxy that help to logging method execution time
 * <p>
 * <b>how to use</b>:
 * <p>
 * <b>way one</b>: create an instance of this class, and call bind() with the object to be proxyed, and get a proxy instance, cast the return value of bind() to
 * a type that is one of the interfaces of the proxyed object, then call on the proxy instance,
 * 
 * <pre>
 * e.g:
 * IHello hello = (IHello) new TimerProxy().bind(new Hello());
 * hello.hello(&quot;eric&quot;);
 * </pre>
 * <p>
 * <b>way two</b>: static getProxy() is a simpler way to use, underling it use way one,
 * 
 * <pre>
 * e.g:
 * IHello hello = TimerProxy.getProxy(new Hello(), IHello.class);
 * hello.hello(&quot;eric&quot;);
 * </pre>
 * 
 * </p>
 * 
 * @author eric
 * @date Dec 7, 2012 4:14:27 PM
 */
public class TimerProxy implements InvocationHandler {
	private Object obj; // the object to be proxyed
	private static Logger logger = Logger.getLogger(TimerProxy.class);

	/**
	 * create a proxy instance
	 * 
	 * @param obj
	 *            the object to be proxyed
	 * @return the proxy instance
	 */
	public Object bind(Object obj) {
		this.obj = obj;
		return Proxy.newProxyInstance(this.obj.getClass().getClassLoader(), this.obj.getClass().getInterfaces(), this);
	}

	/**
	 * get a proxy instance
	 * 
	 * @param obj
	 * @return
	 */
	public static Object getProxy(Object obj) {
		return new TimerProxy().bind(obj);
	}

	/**
	 * get a proxy instance, and cast to specified type,
	 * 
	 * @param obj
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public static <T> T getProxy(Object obj, Class<T> clazz) {
		return (T) (getProxy(obj));
	}

	@Override
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
		Object result = null;
		long start = System.currentTimeMillis();
		result = method.invoke(this.obj, args);
		logger.info(method.getDeclaringClass().getName() + "." + method.getName() + "() called, during " + (System.currentTimeMillis() - start)
				+ " milliseconds.");
		return result;
	}
}
 

 

ProxyTest.java

 

package eric.j2se.proxy;

/**
 * proxy test
 * 
 * @author eric
 * @date Dec 7, 2012 4:11:03 PM
 */
public class ProxyTest {
	public static void main(String[] args) {
		// test();
		test2();
	}

	public static void test() {
		IHello hello = (IHello) new TimerProxy().bind(new Hello());
		hello.hello("eric");
	}

	public static void test2() {
		IHello hello = TimerProxy.getProxy(new Hello(), IHello.class);
		hello.hello("eric");
	}
}
 

------


 

分享到:
评论

相关推荐

    java proxy demo 代理类的运用demo

    在这个“java proxy demo”中,我们将深入探讨如何利用Sun JDK API来创建和使用Java动态代理。 首先,我们要了解Java代理的基本概念。Java代理分为静态代理和动态代理两种。静态代理是在编译时就已经确定代理类的...

    Java_ProxyServer.rar_Java ProxyServer_java proxy server

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

    java proxy

    Java中的动态代理主要通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。动态代理可以在运行时创建一个实现一组给定接口的新类,而无需知道实际的目标对象。代理类是在运行时动态...

    java Proxy 动态代理

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

    深入理解Java Proxy机制.doc

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

    深入理解JavaProxy机制.doc

    Java Proxy 机制是Java语言提供的一种动态代理功能,允许我们在运行时创建一个新的类,这个类可以实现一组指定的接口,并且在方法调用时插入自定义的行为。这主要通过`java.lang.reflect.Proxy`类和`java.lang....

    从房屋买卖看 java proxy 模式

    标题中的“从房屋买卖看 java proxy 模式”暗示了我们将通过一个具体的场景来探讨 Java 中的代理(Proxy)模式。在软件设计中,代理模式是一种结构型设计模式,它为其他对象提供一种代理以控制对这个对象的访问。在...

    JavaProxy Demo

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

    java 实现HTTP PROXY

    Java实现HTTP PROXY是一个常见的需求,特别是在开发网络应用或者测试环境中,我们可能需要通过代理服务器转发HTTP请求。本文将深入探讨如何使用Java编程语言来创建一个HTTP代理服务器,并且会涉及相关的源码分析。 ...

    Java Proxy机制详细解读

    Java Proxy机制详细解读 Java Proxy机制是Java语言中的一种设计模式,主要用于将对象的调用行为与实现解耦,提供了一个代理对象,使得外界无法直接访问目标对象,从而提高了系统的灵活性和可维护性。 Proxy机制的...

    proxy.jsp、proxy.ashx、proxy.php、proxy.config

    **proxy.jsp** 是一个用Java编写的代理页面,适用于Java服务器环境,如Tomcat。它通过设置`esri.config.defaults.io.proxyUrl`来指定代理服务的URL,当ArcGIS JavaScript API请求需要跨域访问的资源时,会自动通过这...

    A Java proxy for MS SQL Server Reporting Services

    NULL 博文链接:https://lgr310-163-com.iteye.com/blog/686040

    java_proxy_end

    1. **Java Proxy Class**: Java的`java.lang.reflect.Proxy`类是动态代理的基石。它允许我们在运行时创建一个新的类,这个类可以作为其他接口的实现,这样我们就可以在调用接口方法时插入自定义的行为。在这个`java_...

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

    在Java中,我们可以使用`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现。`Proxy`类用于创建代理对象,`InvocationHandler`接口定义了代理对象方法调用的处理逻辑。在"DynamicProxy...

    java实现Proxy例子

    我自己用eclipse写的java代码,可以直接用eclipse导入,也可以直接用java -jar proxy_sample.jar执行 代码量很小,尽量通过注释进行说明 本例实现了InvocationHandler接口,代码具有典型性 在研究代理模式(Proxy...

    Webscarab java proxy

    一个用来分析使用HTTP和HTTPS协议的应用程序框架 它的原理很简单,WebScarab记录它检测到的会话内容(请求和应答),使用者可以通过多种形式来查看记录。...也可以用它来调试程序中较难处理的 bug,也可以帮助安全...

    JAVA 通过proxy代理方式访问internet资源

    JAVA 通过proxy代理方式访问internet资源,

    java实现免费代理IP的获取方式 并实时校验代理IP是否有效

    Java 实现免费代理IP的获取方式 并动态实时校验是否有效,java文件项目内含有Jsoup的Jar包(Jsoup是加工过的,含请求),有2个主入口程序: 其一:用于请求代理IP,并立即校验是否是一个有效的代理IP,如果有效,...

    JdkProxy.java

    JdkProxy.java

Global site tag (gtag.js) - Google Analytics