Dynamic Proxy (动态代理)

标签: dynamic proxy 代理 | 发表时间:2012-03-11 16:18 | 作者:hzc543806053
出处:http://blog.csdn.net

动态代理主要有一个 Proxy类 和一个 InvocationHandler接口

动态代理角色:

1. 抽象主题角色

2. 真实主题角色(实现了抽象主题接口)

3. 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法)

Proxy 要调用 newProxyInstance方法

 

代码演示:

 

1.抽象主题角色 SubjectDemo.java

 

package com.dynamicproxy ;

public interface SubjectDemo
{
	public void request() ;
}

 

2. 真实主题角色 RealSubjectDemo.java

 

package com.dynamicproxy ;


public class RealSubjectDemo implements SubjectDemo
{
	public void request()
	{
		System.out.println("实现了某请求") ;
	}
}

 

3. 动态代理主题角色 DynamicProxySubjectDemo.java

 

package com.dynamicproxy ;

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


public class DynamicProxySubjectDemo implements InvocationHandler
{
	private Object sub ;

	public DynamicProxySubjectDemo(Object obj)
	{
		this.sub = obj ;
	}

	public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
	{
		System.out.println("before"+method) ;

		method.invoke(sub, args) ;//真实的调用方法操作

		System.out.println("after"+method) ;

		return null ;

	}


}


4.客户端 Client.java

 

package com.dynamicproxy ;

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

public class Client
{
	public static void main(String[] args)
	{
		RealSubjectDemo rsd = new RealSubjectDemo() ;

		InvocationHandler handler = new DynamicProxySubjectDemo(rsd) ;
       
		Class<?> classType = handler.getClass() ;
        
		// classType.getClassLoader() 动态代理类的类加载器
        //rsd.getClass().getInterfaces() 代理类要实现的接口列表
        //handler 指派方法调用的调用处理程序
		SubjectDemo sd = (SubjectDemo)Proxy.newProxyInstance(classType.getClassLoader(), rsd.getClass().getInterfaces(), handler ) ;
        
		//这行代码一执行 转到 InvocationHandler handler = new DynamicProxySubjectDemo(rsd)
         //执行invoke方法
        sd.request() ;
	}
}


 


 

 

 

 


 

 

 

作者:hzc543806053 发表于2012-3-11 16:18:58 原文链接
阅读:16 评论:0 查看评论

相关 [dynamic proxy 代理] 推荐:

Dynamic Proxy (动态代理)

- - CSDN博客推荐文章
动态代理主要有一个 Proxy类 和一个 InvocationHandler接口. 真实主题角色(实现了抽象主题接口). 动态代理主题角色(实现了 InvocationHandler接口,并实现了 invoke()方法). Proxy 要调用 newProxyInstance方法. 1.抽象主题角色 SubjectDemo.java.

java 动态代理(Proxy)

- - BlogJava_首页
动态代理可以提供对另一个对象的访问,同时隐藏实际对象的具体事实,代理对象对客户隐藏了实际对象. 动态代理可以对请求进行其他的一些处理,在不允许直接访问某些类,. 或需要对访问做一些特殊处理等,这时候可以考虑使用代理. 目前 Java 开发包中提供了对动态代理的支持,但现在只支持对接口的实现. 主要是通过 java.lang.reflect.Proxy 类和 java.lang.reflect.InvocationHandler 接口.

设计模式之代理模式(Proxy)

- - 博客园_首页
这段时间一直忙于期末考试,好久没来博客园了,现在好了,终于考完了,也该过上正常的日子了. 开学就是大四的学生了,时间过的可是真快啊,转眼间大学四年已经接近尾声了. 回想大学这三年,成绩还可以吧(年级前10%),参加过各种竞赛(acm,数学建模等等),学生会也呆过(打了一年的酱油),好哥们也有那么五六个(希望以后能在一个城市发展,大学期间的宝贵财富啊),另外所谓的大学生创新实践项目也搞了一个(就算开阔一下视野吧,大学能生有什么创新呢.

动态代理双剑客--JDK Proxy与CGLIB

- - CSDN博客推荐文章
研究过设计模式的同胞们都知道代理模式可以有两种实现方案:. 1.接口实现(或继承抽象类). 都可以通过Proxy控制对Target的访问. “接口实现”的方式更加灵活,代理类可以代理所有实现了ISubject接口的类;. “继承父类”的方式代理类只能代理它的父类,因为java中只支持单继承. 如果Target有直接接口,那么这两种方式都可以;.

Ubuntu安装squid作为内网的代理服务器(Proxy)的简单配制

- - CSDN博客系统运维推荐文章
我有一台Ubuntu Linux的机器,它有无线网卡,可以上外网. 我想把它设置为代理服务器,这样内网里的其他机器就可利用它作为代理上外网了. 在Ubuntu Linux上安装squid. 安装好后会自动启动,如果使用默认配制,在另一台机器上设置代理(这是我在Chrome上设置代理):. 看来还没有Access的权限,配制squid.

MySQL Proxy 0.8.4 发布

- - 开源中国社区最新新闻
MySQL Proxy 0.8.4 发布. 2014-01-10 这是MySQL官方读写分离以及负载均衡工具,上一个版本还是2012-08-20的0.8.3.过了一年半. 国内360基于这个发布了Atlas. MySQL-Proxy是处在你的MySQL数据库客户和服务端之间的程序,它还支持嵌入性脚本语言 Lua.

Dynamic Code Evolution for Java dcevm 原理 - redcreen

- - 博客园_redcreen的专栏
在 hostswap dcevm中我们对Dynamic Code Evolution VM有了一个简单的了解,这篇文章将介绍Dynamic Code Evolution VM的实现原理. Dynamic Code Evolution (下文简称DCE):泛指java在运行时修改程序的技术.例如aop等.

为MetroTwit设置Http Proxy

- stranger - iGFW
MetroTwit无疑是Windows平台上让人赏心悦目的Twitter Client. 但没有为用户提供Http Proxy或API Proxy,这给很多人带来了使用上的不便. 下面我尝试了两种为MetroTwit设置Http Proxy的方法,效果都还不错. 为Windows系统设置全局的Proxy,也就是在IE中设置Proxy.

Twemproxy – Twitter 开源的 Redis proxy

- - NoSQLFan
在去年的QCon London2012 大会上,Twitter 发表了题为 《 Timelines @ Twitter》的演讲,里面提到以 Redis作为其timeline的主要存储,目前目测全球范围内,Twitter可能是Redis的最大用户了(或者是新浪微博. 而今天我们要说的这个 Twemproxy,是 Twitter 开源出来的 Redis 和 Memcached 代理.

使用Mono.Cecil辅助ASP.NET MVC使用dynamic类型Model

- wang - 老赵点滴 - 追求编程之美
这也是之前在珠三角技术沙龙上的示例之一,解决的是在ASP.NET MVC使用dynamic类型Model时遇到的一个真实问题. C# 4编译器支持dynamic类型,因此在编写页面模板的时候自然就可以把它作为视图的Model类型. 表现层的需求很容易改变,因此dynamic类型的Model可以减少我们反复修改强类型Model的麻烦,再配合匿名类型的使用,可谓是动静相宜,如鱼得水.