首先,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代理的更多相关文章

  1. Java代理模式

    java代理模式及动态代理类 1.      代理模式 代理模式的作用是:为其他对象提供一种代理以控制对这个对象的访问.在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端和目 ...

  2. java 代理的三种实现方式

    Java 代理模式有如下几种实现方式: 1.静态代理. 2.JDK动态代理. 3.CGLIB动态代理. 示例,有一个打招呼的接口.分别有两个实现,说hello,和握手.代码如下. 接口: public ...

  3. java代理的深入浅出(二)-CGLIB

    java代理的深入浅出(二)-CGLIB 1.基本原理 CGLIB的原理就是生成一个要代理类的子类,子类重写要代理的类的所有不是final的方法.在子类中拦截所有父类方法的调用,拦截下来交给设置的Me ...

  4. java代理的深入浅出(一)-Proxy

    java代理的深入浅出(一)-Proxy 1.什么是代理 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事 ...

  5. Java代理(静态/动态 JDK,cglib)

    Java的代理模式是应用非常广泛的设计模式之一,也叫作委托模式,其目的就是为其他的对象提供一个代理以控制对某个对象的访问和使用,代理类负责为委托类预处理消息,过滤消息并转发消息,以及对消息执行后续处理 ...

  6. JAVA代理机制

    JAVA代理相关主要知识如下: (1)利用代理可以在运行时创建一个实现了一组给定接口的新类.         这种功能只有在编译时无法确定需要实现哪个接口时才有必要使用. (2)假设有一个表示接口的C ...

  7. ajax发送请求跨域 - uri java代理

    问题:ajax发送请求出现cors跨域 解决办法:可以通过java代理的方式,后台发送请求 1.get请求 public void proxyGet(String url) { try { URL r ...

  8. java代理通俗简单解析

    1         代理 1.1            代理的概念和作用 代理的概念很好理解,就像黄牛代替票务公司给你提供票,经纪人代理艺人和别人谈合作.Java的代理是指实现类作为代理类的属性对象, ...

  9. Java 代理模式

    熟悉设计模式的人对于代理模式可能都不陌生.那什么事代理呢,例如我们要买一件国外的商品,但是自己买不到只能去找代购,这个代购就是我们的代理.我们来了解下java中的代理 静态代理 我们来举一个开车的例子 ...

  10. java 代理模式(静态代理、动态代理、Cglib代理) 转载

    Java的三种代理模式 1.代理模式 代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...

随机推荐

  1. C#中Socket编程解决应用程序直接的通信

    using System;using System.Collections.Generic;using System.Linq;using System.Text; using System.Net; ...

  2. settimeout vs setinternal

    http://blog.sina.com.cn/s/blog_6b1ab3be0100pzmo.html http://www.360doc.com/content/11/0412/17/100779 ...

  3. Win7系统Matlab2013a安装.m文件不自动关联到MATLAB.exe解决方法

    1.在matlab命令行中输入以下代码: cwd=pwd; cd([matlabroot '\toolbox\matlab\winfun\private']); fileassoc('add',{'. ...

  4. Java 8 的 JVM 有多快?Fork-Join 性能基准测试

    Java 8 已经发布一段时间了,许多开发者已经开始使用 Java 8.本文也将讨论最新发布在 JDK 中的并发功能更新.事实上,JDK 中已经有多处java.util.concurrent 改动,但 ...

  5. 【UVA 10369】 Arctic Network (最小生成树)

    [题意] 南极有n个科研站, 要把这些站用卫星或者无线电连接起来,使得任意两个都能直接或者间接相连.任意两个都有安装卫星设备的,都可以直接通过卫星通信,不管它们距离有多远. 而安装有无线电设备的两个站 ...

  6. POJ_3321_APPLE_TREE

    poj上面的一道求子树上苹果的题目,网上看了很多题解,下面我来回忆一下,基本来源于大神的微博,http://blog.csdn.net/zhang20072844,我来做个搬运工.先将树的n条边上节点 ...

  7. 为什么手机连接wifi会显示已停用?

    1.通常导致手机连接WiFi显示“已停用”故障的原因是由于无线路由器“安全模式”设置不当造成的,对此我们可以通过以下方法来解决: 2.根据无线路由器背面的信息(包括路由器IP地址,登陆用户名和密码), ...

  8. delphi非IE内核浏览器控件TEmbeddedChrome下载|TEmbeddedChrome代码

    下载地址: 点击下载 代码示例: 在TForm的oncreate方法中写入一些代码 procedure TForm1.FormCreate(Sender: TObject); begin Chromi ...

  9. 抽象工厂模式[wiki]

        抽象工厂[编辑] 维基百科,自由的百科全书   跳转至: 导航. 搜索   以统一塑模语言中的类型图来表示抽象工厂 抽象工厂模式(英语:Abstract factory pattern)是一种 ...

  10. oracle core 概述

    oracle数据库系统的架构及其复杂,其提供的特性也非常的多.作为一种关系型数据库,oracle提供的基本特性: transaction concurrency read consistent 而支撑 ...