`

Java Proxy代理学习

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



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



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

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

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

    3.调试时跟踪方法调用

以下举出一例,使用代理和调用处理器跟踪方法调用
HelloWorld.class接口
public interface HelloWorld {
	public void SayHello(String name);
}

HellWorld实现类
public class HelloWorldImpl implements HelloWorld {

	public void SayHello(String name) {

			System.out.println("Hello,"+name);
	}

}

测试类
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
//动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。
//该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类 
public class ProxyTest {
	public static void main(String[] args) {
		HelloWorld helloWorld = new HelloWorldImpl();           
		DynamicProxy dp = new DynamicProxy();           
		//在这里绑定的是HelloWorld,也就是HelloWorld是被代理接口。所以绑定关系时,需要传递一个HelloWorld的实现类的实例化对象。           
		HelloWorld helloWorld1 = (HelloWorld)dp.bindRelation(helloWorld);            
		helloWorld1.SayHello("cookies");          
		System.out.println(Proxy.isProxyClass(helloWorld1.getClass()));     
		//helloWorld2将不被拦截       
		HelloWorld helloWorld2 = new HelloWorldImpl();       
		helloWorld2.SayHello("cookies");            

	}

}
class DynamicProxy implements InvocationHandler
{

	private Object object;            
	//绑定关系,也就是关联到哪个接口(与具体的实现类绑定)的哪些方法将被调用时,执行invoke方法。       
	//Proxy.newProxyInstance的第三个参数是表明这些被拦截的方法执行时需要执行哪个InvocationHandler的invoke方法       
	public Object bindRelation(Object object){            
		this.object = object;           
		return Proxy.newProxyInstance(object.getClass().getClassLoader(), object.getClass().getInterfaces(),this);            
	}            
	//拦截关联的这个实现类的方法被调用时将被执行           
	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {            
		System.out.println("Welcome");           
		Object result = method.invoke(object, args);            
		return result;           
	}           


}
分享到:
评论

相关推荐

    代理模式java代码 Proxy(1)

    代理模式java代码 Proxy(1) java 学习必备......

    java 静态代理和动态代理学习实例源码

    java static proxy dynamic proxy

    Proxy 模式学习代码

    Proxy 模式学习代码,包括静态代理,动态代理,cglib等

    apache开源项目源码commons-proxy-1.0-src(全部高质量代理模式proxy的java源程序)

    全部高质量代理模式proxy的java源程序 java.proxy,代理模式源码,设计模式,apache开源项目源码commons-proxy-1.0-src 各种代理模式操作的工具类源码以及代理模式案例源码,你会从中得到意想不到的效果! apache...

    Java动态代理语法Proxy类原理详解

    主要介绍了Java动态代理语法Proxy类原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    Java动态代理学习测试类

    java 动态代理 测试类

    浪曦经典Java代码--反射+代理reflection_proxy源码

    浪曦经典Java代码--反射+代理reflection_proxy源码 优秀代码,值得java学习者学习!

    java网络代理源代码

    自己开发,自己用于调试的源代码。主要用于调试监控网络的数据。可以做为一个简单的代理,监控工具。 源代码比较简单,大家需要的话可供学习使用。

    面试官:你说你懂动态代理,那你知道为什么JDK中的代理类都要继承Proxy吗?

    在动态代理学习(二)JDK动态代理源码分析中我已经讲JDK底层生成的字节码文件反编译成了java代码,如下: public final class proxy extends Proxy implements MyService { private static Method m1; private ...

    JAVA上百实例源码以及开源项目源代码

     一个Java+ajax写的登录实例,附有JAVA源文件,JAVA新手朋友可以学习一下。 JAVA+JSP的聊天室 8个目标文件 简单 JavaScript万年历 显示出当前时间及年份,还可以选择年份及月份和日期 Java编写的HTML浏览器 一个...

    java-sington-factory-proxy 开发模式

    该资源包中分别使用单例,工厂,代理三种java开发模式,注释清晰,方便学习容易,,,通过小例子的演示让你轻松学会这三种开发模式!最重要的是物美价廉呢

    基于java的企业级应用开发:JDK动态代理.ppt

    * * * * JDK动态代理 JDK动态代理 JDK动态代理是通过java.lang.reflect.Proxy 类来实现的,我们可以调用Proxy类的newProxyInstance()方法来创建代理对象。对于使用业务接口的类,Spring默认会使用JDK动态代理来实现...

    JAVA上百实例源码以及开源项目

    笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级、中级、高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情、执着,对IT的憧憬、向往!此时此...

    Java的动态代理机制详解

    一个是IoC,另一个是AOP,对于IoC,依赖注入不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的我们的功能,我们更需要学习的是其底层是怎么样的一个原理,而AOP的原理是java的动态代理机制...

    Java 高级特性.doc

    象以后我门在学习JAVA 的时候,一定要对每个知识点要慢慢的消化吃透,切不能走马观花。一个知识点必须要反复的动手练习,不然很难理解其中的奥秘所在的! 5.在JAVA的程序中,我经常性的看到字符前面有@这种标志的...

    JAVA的反射机制与动态代理.pdf

    那个最近想看看Spring AOP的动态代理到底是个咋回事,特地学习了一下,写了个文档。 本文档先讲解了JDK的反射机制,然后是Proxy的动态代理、CGLIB的动态代理,因为这些是Spring AOP的底层技术,清楚了它们,你就更...

    工具查询WEB Proxy Mcncc 在线代理 PHP 单文件 -proxy-p.rar

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...

    [工具查询]WEB Proxy Mcncc 在线代理 PHP 单文件。_proxy_p.rar

    包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、web、C#、EDA、proteus、RTOS等项目的源码。【项目质量】:所有源码都经过严格测试,可以直接运行。功能在确认正常工作后才上传。【适用人群】:适用...

    SimpleWebProxy:用Java编写的简单Web代理

    SimpleWebProxy 一个用Java编写的简单HTTP / 1.0代理。 这是为我的网络课程的家庭作业而编写的,用于学习目的。怎么跑cd src/javac *# java WebProxy <port>java WebProxy 8080它支持什么HTTP / 1.0 GET,HEAD,POST...

    [Java设计模式(第2版)(Design.Patterns.in.Java).John.Metsker

    第11章 代理(proxy)模式 97 第12章 职责链(chain of responsibility)模式 115 第13章 享元(flyweight)模式 122 第14章 构造型模式介绍 130 第15章 构建者(builder)模式 134 第16章 工厂方法(factory method)模式 141...

Global site tag (gtag.js) - Google Analytics