`
忆梦竹
  • 浏览: 65818 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

动态代理的幕后

    博客分类:
  • JAVA
阅读更多
这篇文章将这样来组织:
1. 简单的例子展示静态代理和动态代理。
2. 两种代理的区别。
3. 动态代理的幕后。

静态代理的例子:

package com.piedra.proxy;

/**
 *  StaticProxy.java
 */
public class StaticProxy
{
	public static void main(String[] args){		
		MyProxy proxy = new MyProxy(new ConcreteSubject());
		proxy.saySomething("troubler","Hello,Proxy!");
		proxy.saySomething("piedra","Hello,Proxy!");				
	}	
}

abstract class Subject
{
	public abstract void saySomething(String name,String cont);
}

class ConcreteSubject extends Subject
{
	public void saySomething(String name,String cont){
		System.out.println(name + "说:" + cont);
	}
}


class MyProxy
{
	private Subject subject = null;

	public MyProxy(Subject subject){
		this.subject = subject;
	}

	public void saySomething(String name,String cont){
		if(name!=null && !name.equals("troubler")){
			subject.saySomething(name,cont);
		} else {
			System.out.println("Sorry! You are the troulber. You are not allowed to speak.");
		}
	}
}
 

代码解释:
这里我们让MyProxy来代理Subject对象,那么当我们调用MyProxy的saySomething方法的时候,他会先做一些处理,然后再根据需要调用相应的他所代理的对象的方法。如果需要更多代理模式的内容,你可以google下,会有很多好的资料。

动态代理的简单演示:
我在我的第一篇博文中有浅浅的讲解了动态代理的用法
http://yimengzhu.iteye.com/blog/1133359  不过这里我还是简单提下

package com.piedra.proxy;

import java.lang.reflect.*;

public class DynamicProxy
{
	public static void main(String[] args){
		MyTarget target = new MyTarget();//创建一个目标对象,即待会要被代理的对象。
		MyHandler handler = new MyHandler(target);//待会动态代理对象会将任务分发给这个handler对象的invoke方法处理
		Target proxy = (Target)Proxy.newProxyInstance(target.getClass().getClassLoader(),new Class[]{Target.class},handler);
		proxy.saySomething("piedra","hello,dynamic proxy.");
	}
}

interface Target
{
	public void saySomething(String name,String cont);
}

class MyTarget implements Target
{
	public void saySomething(String name,String cont){
		System.out.println(name + "说: " + cont);
	}
}

class MyHandler implements InvocationHandler
{	
	private Object target;

	public MyHandler(Object target){
		this.target = target;
	}

	public Object invoke(Object proxy,Method method,Object[] args)throws Throwable {
		method.invoke(target,args);
		return null;
	}
}


实验截图:








如果你对代理或者动态代理还不是很熟悉,那么你看着可能有点吃力,那么你可能就应该到google上搜索资料好好的学习下了。

接着我将简单说一下我对静态代理和动态代理的区别的看法:
静态代理他要实现跟目标类一样的接口或者抽象类,然后里面需要实现的方法都要你显示的写出来。然而对于动态代理,你却会发现,只需要一个InvocationHandler就可以搞定了。

那么动态代理到底有什么神奇的力量会这么简单?原因是,当我们调用Proxy的newProxyInstance的时候,Proxy内部会帮助我们创建一个代表我们目标对象的代理对象。因为我们传入了我们的目标类说实现的接口,然后我们也传递给他一个ClassLoader,这样JVM就会知道利用那个ClassLoader去装载这个代理的class文件(Proxy帮我们创建的)。
我想这时候你应该已经明白了。真相就是Proxy帮我们创建的代理对象,然后将直接转发给我们的InvocationHandler对象,接着我们就可以在InvocationHandler对象里面的invoke方法里面为所欲为了。

你有没有发现,这样当我们的Target接口里面的方法变了。如果我们还是使用静态代理那么我们的代理对象也要跟着变,但是如果使用动态代理,我们不需要该表代理对象,只需要变化相应的目标对象就可以了。因为在动态代理中代理对象的生成是Proxy自动生成了。(具体使用的技术我还不懂得用)。

尽管这篇文章深度还不够。但是还是谢谢您的阅读。

但愿我的文章的内容对得起您宝贵的时间!

(注:转载请注明出处,爬虫请加个链接再发布,谢谢您的理解!)

GOF设计模式链接:http://download.csdn.net/detail/hhxy_piedra/4184424


  • 大小: 8.2 KB
  • 大小: 15.7 KB
  • 大小: 14.3 KB
0
0
分享到:
评论

相关推荐

    一个简单的java动态代理的实例

    4. **调用代理对象的方法**:最后,通过代理对象调用方法,`invoke()`方法将在幕后自动调用。 ```java proxyService.execute(); ``` 在本例中,`springTest`可能是与Spring框架相关的测试,因为Spring也支持动态...

    数据库连接池——JDBC通过代理模式来保持用户关闭连接的习惯

    它们都采用了类似代理模式的设计,使得开发人员可以像使用普通JDBC连接一样使用连接池,但在幕后,连接的生命周期被精心管理。例如,当调用`Connection.close()`方法时,代理并不会真正关闭连接,而是将其放回连接池...

    SpringAOP的例子

    在这个"SpringAOP的例子"中,我们将深入探讨如何在Eclipse环境下利用Spring AOP和动态代理来实现这些功能。 首先,让我们理解什么是AOP。AOP是一种编程范式,旨在减少代码的重复性和增强可维护性。在传统的OOP中,...

    43-Rasa课程、Rasa培训、Rasa面试系列之:Rasa幕后英雄系列-高级机器学习研究员 Aciel Eshky.docx

    在Rasa的幕后,高级机器学习研究员Aciel Eshky的工作展示了研究与工程的结合,尤其是在对话管理和强化学习方面。他的工作不仅涉及创建新模型和组件,还涵盖评估方法的开发,这对于提高对话系统的质量和效率至关重要...

    赵连成:行稳致远,推进企业流程自动化人工智能行业发展的幕后英雄.pdf

    2017年,在SAP公司担任中国区代理副总裁,他凭借出色的综合能力,在职业生涯中取得了显著的成功。然而,他并没有因此而止步不前,而是选择了继续向前迈进,加入了全球领先的企业级机器人自动化平台解决方案公司...

    ServiceProxy

    服务代理的核心概念是代理类,它充当原始服务类的替身,提供与原始服务相同的接口,但在幕后执行额外的任务。例如,当客户端请求一个操作时,代理可能先进行身份验证,然后调用实际的服务,最后记录日志。这样,服务...

    spring运行机制源码剖析

    Spring AOP主要通过动态代理实现,分为JDK动态代理和CGLIB动态代理。JDK代理用于接口实现类,而CGLIB代理则用于没有接口的类。通过定义切面(Aspect)、通知(Advice)、切入点表达式(Pointcut Expression)等概念...

    6-2019051114-李芷靖-DDOS1

    由于攻击者隐藏在幕后,攻击行为难以追踪,使得DDoS攻击具有一定的隐蔽性。 实验目的旨在让参与者理解DDoS攻击的基本原理,并掌握TFN2K这种特定的DDoS攻击工具的使用。TFN2K(Trinoo Forked 2000)是一款利用AES...

    Java深度历险

    同时讲解动态代理,如何在运行时创建代理类实现接口。 8. **Java集合框架** - 深入解析ArrayList、LinkedList、HashMap、HashSet等常用集合类的内部实现,以及它们的性能特点和适用场景。 9. **IO与NIO** - 介绍...

    nucypher:分散阈值密码网络,提供用于秘密管理和动态访问控制的接口和运行时

    分散式密码网络,为秘密管理和动态访问控制提供可访问,直观和可扩展的运行时和接口。... 在幕后,NuCypher网络使用阈值代理重新加密方案提供密码访问控制。NuCypher如何工作? 数据所有者爱丽丝(Alice)通过

    89丨开源实战五(下):总结MyBatis框架中用到的10种设计模式1

    在前几讲中,我们已经了解了职责链模式(如Servlet Filter、Spring Interceptor、MyBatis Plugin)和动态代理模式。今天,我们将更深入地讨论MyBatis中的其他设计模式。 首先,让我们关注建造者模式在...

    SpringAOP.zip

    8. **AOP代理的理解**:理解Spring是如何通过JDK动态代理或CGLIB代理实现AOP的,这有助于我们了解代理对象是如何在幕后工作的。 9. **实际应用场景**:课程可能还会通过实例讲解AOP在实际项目中的应用,如记录日志...

    felix:Project Calico的每主机代理Felix,负责对路由和安全策略进行编程

    是Calico项目的幕后公司,负责项目的持续管理。 但是,它对社区的任何成员(个人或组织)开放并参与并贡献代码。 贡献 感谢您考虑为Calico项目做出贡献! 开源项目的成功完全取决于其贡献者的努力,因此,我们确实...

    MyBatis面试专题及答案.pdf

    这种机制利用了CGLIB来创建代理对象,当试图访问延迟加载的属性时,代理对象会在幕后执行SQL获取所需数据。 MyBatis与Hibernate的主要区别在于,Hibernate提供了一种更全面的对象关系映射解决方案,包括自动的关联...

    javaf反射的一些方法介绍,使用和讲解

    这在处理动态代理、插件系统等场景中非常有用。 在Java反射中,还有`Field`类,它用于表示类的成员变量。我们可以通过`Field`对象获取或设置字段的值,即使这个字段是私有的。例如,`field.set(obj, value)`可以为...

    代理商的立法修正-研究论文

    它还描述了国会与机构官员之间关于此类修复的幕后,立法后对话,而这种对话通常是公众所看不见的。 该条表明,各机构通常以不透明且受法律框架外部因素驱动的方式来修正立法起草错误。 这些机构立法手段的初衷是...

    Mycroft Core,Mycroft人工智能平台。-Python开发

    目录目录入门使用Mycroft家用设备和帐户管理器在后台运行Mycroft幕后知识配对信息配置使用不带Home API的Mycroft密钥服务在代理后使用Mycroft在代理后使用Mycroft在未经身份验证的代理后使用Mycroft在经过身份验证的...

    logging_frontend_apps:NGINX配置以代理前端应用程序的日志记录功能

    对于服务器到服务器的通信,这发生在封闭的幕后,即。 VPN或防火墙。 对于前端应用程序,必须打开一个开放的端点,这引发了许多安全性问题。 该存储库旨在通过关注现有基础结构的安全性和稳定性来为此类场景提供...

    报关实务之报关概述.pptx

    11月14日,该案幕后涉及到的5个走私团伙共25人在深圳中院出庭受审,这几个团伙走私的iPhone等手机多达16.2万余台,偷逃税款5487.1万元。 知识点总结 * 报关的概念和范围 * 报关的分类 * 报关的基本内容 * 进出境...

Global site tag (gtag.js) - Google Analytics