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)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩 ...
随机推荐
- 基于jsp+servlet图书管理系统之后台用户信息查询操作
上一篇的博客写的是插入操作,且附有源码和数据库,这篇博客写的是查询操作,附有从头至尾写的代码(详细的注释)和数据库! 此次查询操作的源码和数据库:http://download.csdn.net/de ...
- Morgan stanley 电话面试
首先是聊项目, 不会涉及到具体的技术问题 1.C和C++的区别:C++里的RTTI 2.vector 和 list的区别 : casting operator ; smart pointer. 3.数 ...
- uva 812 Trade on Verweggistan
题意: 给w个货架, 每个货架上有bi个货物, 每次只能拿最上面的货物, 每个货物有个价值, 所有货物的售价均为10. 问:能获得的最大利润, 以及能获得这个利润需要多少个货物. (有多种组合时只需输 ...
- (00)Java编程思想开篇立言。
从今天开始,在相当长的时间中我在看Java编程思想.也把这个博客作为开始.这就是一个读书的笔记.
- Metasploit渗透测试魔鬼训练营
首本中文原创Metasploit渗透测试著作,国内信息安全领域布道者和资深Metasploit渗透测试专家领衔撰写,极具权威性.以实践为导向,既详细讲解了Metasploit渗透测试的技术.流程.方法 ...
- WINDOWS WMI--这是一个神奇的应用
运行:wbemtest.exe
- CentOS 如何将.deb 文件 转换.rpm
CentOS 如何将.deb 文件 转换.rpm [root@localhost tmp]#tar zxvf alien_8.88.tar.gz [root@localhost alien]#perl ...
- bzoj1042
首先直接做多重背包肯定会TLE的, 观察这个背包问题有什么特殊性呢 物品种类和重量,价值是一定的,不同的是背包的容量和物品的数量 由于当物品数量没有限制的时候,方案数是可以预处理出来的 所以我们考虑用 ...
- [ZOJ 3631] Watashi's BG
Watashi's BG Time Limit: 3 Seconds Memory Limit: 65536 KB Watashi is the couch of ZJU-ICPC Team ...
- Hadoop RCFile存储格式详解(源码分析、代码示例)
RCFile RCFile全称Record Columnar File,列式记录文件,是一种类似于SequenceFile的键值对(Key/Value Pairs)数据文件. 关键词:Reco ...