java代理
首先,java中为什么要提出代理的设计模式呢?代理模式的作用是:为其它对象提供一种代理以控制对这个对象的訪问。在某些情况下,一个客户不想或者不能直接引用还有一个对象,而代理对象能够在client和目标对象之间起到中介的作用。 上面将的有点抽象,代理发生在代理类和被代理类之间,代理的主要功能就是给被代理类的方法做一些事前处理和事后处理的工作。java中代理又分为静态代理和动态代理。我们一一来看,假设知道Spring中Aop就非常easy理解这里的代理模式了,事实上Spring中Aop就是通过代理模式来实现的
一、静态代理。我们直接上代码
1、接口
public interface Test {
public void request();
}
2、被代理类
public class RealTest implements Test{
@Override
public void request() {
System.out.println("real test");
}
}
3、代理类
public class StaticProxyTest implements Test{
private Test test;
public StaticProxyTest(Test test){
this.test = test;
}
@Override
public void request() {
System.out.println("预处理工作");
test.request();
System.out.println("兴许工作");
}
}
4、測试
//静态代理
public static void fun1(){
StaticProxyTest proxy = new StaticProxyTest(new RealTest());
proxy.request();
}
观察代码能够发现每个代理类仅仅能为一个接口服务,这样一来程序开发中必定会产生过多的代理,并且。所有的代理操作除了调用的方法不一样之外。其它的操作都一样,则此时肯定是反复代码。
解决这一问题最好的做法是能够通过一个代理类完毕所有的代理功能,那么此时就必须使用动态代理完毕。
再来看一下动态代理:
二、动态代理
接口和被代理类不变
代理类:(整个类中是没有特定的对象的。所以称为动态代理。具有通用行)
public class DynamicProxyTest implements InvocationHandler{
private Object test;//能够用Test取代Object
public DynamicProxyTest(Test test){
this.test = test;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
System.out.println("预处理工作");
method.invoke(test, args);
System.out.println("兴许工作");
return null;
}
}
測试:
//动态代理
/**
* 通过这样的方式,被代理的对象(RealTest)能够在执行时动态改变。
* 须要控制的接口(Test接口)能够在执行时改变,
* 控制的方式(DynamicProxyTest类)也能够动态改变,从而实现了很灵活的动态代理关系
*/
public static void fun2(){
RealTest test = new RealTest();
Class t = test.getClass();
InvocationHandler handler = new DynamicProxyTest(test);
//相当于生成了一个实现的Test接口的一个类
Test te = (Test)Proxy.newProxyInstance(t.getClassLoader(), t.getInterfaces(), handler);
te.request();
}
Java动态代理类位于Java.lang.reflect包下,一般主要涉及到下面两个类:
(1). Interface InvocationHandler:该接口中仅定义了一个方法Object:invoke(Object obj,Method method, Object[] args)。在实际使用时,第一个參数obj通常是指代理类。method是被代理的方法,如上例中的request()。args为该方法的參数数组。
这个抽象方法在代理类中动态实现。
(2).Proxy:该类即为动态代理类。作用类似于上例中的ProxySubject,当中主要包括下面内容:
Protected Proxy(InvocationHandler h):构造函数,预计用于给内部的h赋值。
Static Class getProxyClass (ClassLoader loader, Class[] interfaces):获得一个代理类。当中loader是类装载器,interfaces是真实类所拥有的所有接口的数组。
Static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h):返回代理类的一个实例,返回后的代理类能够当作被代理类使用(可使用被代理类的在Subject接口中声明过的方法)。
所谓Dynamic Proxy是这样一种class:它是在执行时生成的class。在生成它时你必须提供一组interface给它,然后该class就宣称它实现了这些 interface。你当然能够把该class的实例当作这些interface中的不论什么一个来用。当然啦。这个Dynamic Proxy事实上就是一个Proxy,它不会替你作实质性的工作,在生成它的实例时你必须提供一个handler,由它接管实际的工作
參考文章:
http://www.cnblogs.com/xiaoluo501395377/p/3383130.html
http://www.cnblogs.com/rollenholt/archive/2012/11/28/2792779.html
http://www.iteye.com/problems/15304
java代理的更多相关文章
- Java代理模式
java代理模式及动态代理类 1. 代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目 ...
- java 代理的三种实现方式
Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...
- java代理的深入浅出(二)-CGLIB
java代理的深入浅出(二)-CGLIB 1.基本原理 CGLIB的原理就是生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法.在子类中拦截所有父类方法的调用,拦截下来交给设置的Me ...
- java代理的深入浅出(一)-Proxy
java代理的深入浅出(一)-Proxy 1.什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事 ...
- Java代理(静态/动态 JDK,cglib)
Java的代理模式是应用非常广泛的设计模式之一,也叫作委托模式,其目的就是为其他的对象提供一个代理以控制对某个对象的访问和使用,代理类负责为委托类预处理消息,过滤消息并转发消息,以及对消息执行后续处理 ...
- JAVA代理机制
JAVA代理相关主要知识如下: (1)利用代理可以在运行时创建一个实现了一组给定接口的新类. 这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. (2)假设有一个表示接口的C ...
- ajax发送请求跨域 - uri java代理
问题:ajax发送请求出现cors跨域 解决办法:可以通过java代理的方式,后台发送请求 1.get请求 public void proxyGet(String url) { try { URL r ...
- java代理通俗简单解析
1 代理 1.1 代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...
- Java 代理模式
熟悉设计模式的人对于代理模式可能都不陌生.那什么事代理呢,例如我们要买一件国外的商品,但是自己买不到只能去找代购,这个代购就是我们的代理.我们来了解下java中的代理 静态代理 我们来举一个开车的例子 ...
- java 代理模式(静态代理、动态代理、Cglib代理) 转载
Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
随机推荐
- linux vi 使用
vi 有一般模式和编辑模式 如vi test.txt 是首先进入的一般模式,一般模式下只能进行复制.删除.粘贴文件数据, 在一般模式下按i .I.a.A.o.O 都能进入编辑模式,按下不同的键进入编辑 ...
- Dynamips做CCNA的实验,说是找不到telnet的解决方案
01.如果你的系统是32位的系统. 控制面板-程序与功能-启动或关闭windows功能-开启telnet(重启计算机就可以用telnet了) 02.如果你的系统是64位的系统. (1)控制面板-程序与 ...
- HTTP状态码——对照表
ASCII码介绍: HTTP状态码(HTTP Status Code)用来表示web服务器响应客户端的HTTP状态.主要有一下5种状态类型.1xx 消息2xx 成功3xx 重定向4x ...
- 自定义scrollbar
Chrome ::-webkit-scrollbar 整体部分 ::-webkit-scrollbar-track 轨道 ::-webkit-scrollbar-track-piece 内层轨道 :: ...
- shell 基础 $(cd `dirname $0`;pwd)
$ cd `dirname $0` 和PWD%/* shell变量的一些特殊用法 在命令行状态下单纯执行 $ cd `dirname $0` 是毫无意义的.因为他返回当前路径的"." ...
- Windows Xp Home Edition 安装IIS组件
问题描述: 在虚拟机(操作系统是Windows Xp Home Edition)中安装Sql Server 2005的时候警告缺少IIS相关组件,控制面板"添加/删除组件"中也没有 ...
- 基于Maven的spring_security入门
配置文件的修改点没什么变化,可以参考:http://blog.csdn.net/ouitiken/article/details/8830505 pom.xml的依赖参考: <dependenc ...
- 从C#到Python —— 4 类及面向对象
http://www.cnblogs.com/yanxy/archive/2010/04/04/c2p_4.html 如果你熟悉C#,那么对类(Class)和面向对象(Object Oriented) ...
- VS(Microsoft Visual Studio2010)工具打开项目所需的应用程序,出现未安装(.csproj)的应用程序的解决办法
打开这个文件的话,从列表中选择打开方式的时候,看看选择打开项目文件的打开方式是不是visual studio,如果是Micrisoft visual studio version selector.那 ...
- 汉企C#面向对象——继承
public class Shengwu { private string _Name; public string Name { get { return _Name; } set { _Name ...