`

proxy 的原理

 
阅读更多
设计模式中proxy模式可以在jdk中的proxy得到体现。
它也是spring的核心思想。

首先我定义个ActionPrettyWomanInterface 接口。
public interface ActionPrettyWomanInterface {
	void action();
}


针对于这个接口,我们可以有多个实现。
一个是帮助美女的实现。
public class HelpPrettyWoman implements ActionPrettyWomanInterface{
	public void action() {
		System.out.println("我在帮美女补丝袜 .");
	}
}

另一个是玩美女。
public class PlayPrettyWoman implements ActionPrettyWomanInterface{
public void action() {
System.out.println("我在玩美女.");
}
}


那么我们只是简单的玩,是不是太没情调了呢。
这时候我们就可以通过代理机制里的InvocationHandler加入一些情调。
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class SexyInvocationHandler implements InvocationHandler{
	private Object prettyWoman;
	public SexyInvocationHandler(ActionPrettyWomanInterface prettyWoman){
		this.prettyWoman=prettyWoman;
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		Object result=null;
		try{
			System.out.println(proxy.getClass().getSimpleName());
			System.out.println("让美女穿上丝袜,剪开档.");
			result =method.invoke(prettyWoman, args);
			System.out.println("抽跟烟~~~.");
		}catch(Exception e){
		}
		return result;
	}

}



之后我们就可以大玩特玩了。
import java.lang.reflect.Proxy;
public class TestActionWithWoman {
	public static void main(String[] args) {
			ActionPrettyWomanInterface playWoman=new PlayPrettyWoman();
		ActionPrettyWomanInterface helpWoman=new HelpPrettyWoman();
		ActionPrettyWomanInterface fuckProxy=(ActionPrettyWomanInterface)Proxy.
		newProxyInstance(playWoman.getClass().getClassLoader(), playWoman.getClass().getInterfaces(), new SexyInvocationHandler(playWoman));
		fuckProxy.action();
		ActionPrettyWomanInterface remedyProxy=(ActionPrettyWomanInterface)Proxy.
		newProxyInstance(helpWoman.getClass().getClassLoader(), helpWoman.getClass().getInterfaces(), new SexyInvocationHandler(helpWoman));
		remedyProxy.action();
		System.out.println("fuckProxy classname:"+fuckProxy.getClass().getName());
	}
}


控制台输出:
引用
$Proxy0
让美女穿上丝袜,剪开档.
我在玩美女.
抽跟烟~~~.
$Proxy0
让美女穿上丝袜,剪开档.
我在帮美女补丝袜 .
抽跟烟~~~.
fuckProxy classname:$Proxy0


从中我们可以知道,当我们用代理机制创建关于接口或者类的对象时候,
它的对象实现是jdk产生的动态代理对象Proxy0。

当我们要调用玩美女或者帮助美女方法时候, 它的实际顺序是先调用InvocationHandler里的invoke, 然后invoke会通过反射调用玩美女或者帮助美女方法。


得出结论:如果我们不实现InvocationHandler的invoke方法,那么我们实际中的方法讲不会被调用到。所以这个类必须重写。

然后另外我们可以得知,创建对象除了new以后,还可以通过代理实现。
分享到:
评论
1 楼 aqqcat 2013-07-03  
这个太骚了同志

相关推荐

    Proxy原理说明的源码

    Proxy原理说明的源码

    rest-proxy主要API总结.docx

    自己总结的rest-proxy主要的API,主要参考官网。

    Proxy Server(代理服务器)

    代理服务器的源程序,只是一个示范,可以了解Proxy原理 program: proxyd module: proxyd.c summary: provides proxy tcp service for a host on an isolated network. programmer: Carl Harris ...

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

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

    Proxy Server 代理服务器的源程序

    代理服务器的源程序,只是一个示范,可以了解Proxy原理

    TCP_Proxy.zip

    一个可以用来制作Hypixel加速线路的工具 自己写的哦 使用方法很简单直接使用java -jar TCP-Proxy.jar启动它就可以了 原理的话是使用Java实现TCP数据转发

    代理模式(Proxy)原理图

    代理模式是一种设计模式,其定义是为其他对象提供一种代理以控制对这个对象的访问。 代理模式的核心在于提供一个代理来控制和限制对另一个对象的直接访问。这种模式通常用于以下几种情况: 远程代理:当对象位于...

    JDK动态代理proxy

    JDK动态代理proxy的基本工作原理代码!!

    Chrome Proxy SwitchyOmega扩展程序

    该插件为Chrome浏览器实现代理服务的插件,能够实现socks5代理服务的功能。

    nginx系列(十)nginx缓存代理proxy_cacahe和CDN实现的原理

    NULL 博文链接:https://phl.iteye.com/blog/2247856

    leetcode分类-com.merry.tool:javarediswxdingding

    proxy原理学习 七、com.java.websocket websocket 学习使用 八、com.leetCode.study LeetCode 学习 九、com.redis.study 整合redis学习 十、com.wx.login 微信登录 十一、com.wx.push 微信推送 十二、...

    chaos-http-proxy, 通过代理服务器向HTTP请求引入故障.zip

    chaos-http-proxy, 通过代理服务器向HTTP请求引入故障 混沌HTTP代理通过代理服务器将失败引入到HTTP请求中。 这可以在HTTP客户机中发现错误处理 Bug 。 Bounce存储 gaul@bouncestorage.com,最初编写了混沌HTTP代理...

    proxydll_9_src

    d3d hack 可用于d3d hook com函数 原理是替换原d3d dll

    Webscarab java proxy

    一个用来分析使用HTTP和HTTPS协议的应用程序框架 它的原理很简单,WebScarab记录它检测到的会话内容(请求和应答),使用者可以通过多种形式来查看记录。WebScarab的设计目的是让使用者可以掌握某种基于HTTP(S)...

    代理服务器使用原理与选购细则

    Proxy Server的工作原理是:当客户在浏览器中设置好Proxy Server后,你使用浏览器访问所有WWW站点的请求都不会直接发给目的主机,而是先发给代理服务器,代理服务器接受了客户的请求以后,由代理服务器向目的主机...

    Vue响应原理 definedProperty与proxy实现数据双向绑定

    Vue中从改变一个数据到页面渲染改变的过程 Vue2 利用definedProperty实现数据绑定 definedProperty 基础使用: var ob={ a:1, b:2 } var _value=ob.a Object.defineProperty(ob,'a',{ //writable:true,//...

    Squid.Proxy.Server.3.1.Beginners.Guide

    介绍Squid应用的书籍,内容很详实。 本书从原理,应用,使用方法进行了描述。

    防火墙技术防火墙原理

     防火墙原理  防火墙主要技术  防火墙体系结构  堡垒主机的作用及部署 数据包过滤规则  状态检测数据包过滤原理 防火墙原理 .1 防火墙的概念 防火墙的功能 边界保护机制 潜在的攻击和可能的对象 4 互操作...

Global site tag (gtag.js) - Google Analytics