=========== ASP.Net+Android+IOS开发.Net培训、期待与您交流!===========

  长沙人从长沙的代理商手中买宏基电脑和直接跑到宏基总部买电脑,最终的主体业务目标有什么区别吗?基本一样,都解决了核心问题,但是,一点区别都没有吗?从代理商那里买真的一点好处都没有吗?

  要为已存在的多个具有相同接口的目标类的各个方法增加一些系统功能,例如,异常处理、日志、计算方法的运行时间、事务管理、等等,你准备如何做?在现实生活中,我们可以从代理商手中拿货;程序中我们可以编写一个与目标类具有相同接口的代理类(类似宏基代理商有宏基电脑),代理类的每个方法调用目标类的相同方法,并在调用方法时加上系统功能的代码(类似代理商要赚取差价)。要为系统中的各种接口的类增加代理功能,那将需要太多的代理类,全部采用静态代理方式,将是一件非常麻烦的事情!JVM可以在运行期动态生成出类的字节码,这种动态生成的类往往被用作代理类,即动态代理类。

  动态代理类的字节码在程序运行时由Java反射机制动态生成,动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。java.lang.reflect 包中提供的和动态代理有关的Proxy类和InvocationHandler 接口有生成动态代理类的能力:

  

public interface InvocationHandler{

    Object invoke(Object proxy, Method method, Object[] args)throws Throwable   ;

}

  class Proxy 真正表示动态代理的类,提供两个静态方法:

  Class<?> getProxyClass(ClassLoader loader, Class<?>[] interface) 用来产生代理类,参数要提供interface数组,它会生成这些interface的“虚拟实现”, 用来冒充真实的对象。

  Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 产生代理对象,多了InvocationHandler参数(只是InvocationHandler接口的实现类), 它与代理对象关联,当请求分发到代理对象后,会自动执行h.invoke(...)方法, invoke方法就是我们加上系统功能的代码的地方。

  A接口有c方法,类B实现A接口,原本应该是执行B类中的c方法,可现在不这样做; 我声明产生B类的代理类B',由它来冒充B类的“兄弟”并“实现”A接口, 对外界来说B'应该也有c方法,可当真正调用它的时候, 它会去执行与它关联InvocationHandler的invoke()方法, 在这个方法里面你可以做很多事情。这样,这个请求就被“代理”到其它地方去了。这就是JDK的动态代理,必须依靠接口实现。如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了,cglib动态代理以后研究再加上。

  动态代理示例:

  1. A接口

public interface AInterface {
public void add();
}

  2. 类B实现接口,即目标:

public class BImpl implements AInterface {  

    @Override
public void add() {
System.out.println("增加方法。。。");
}
}

  3.  B类的代理类B':

  

import java.lang.reflect.*;

public class BProxy implements InvocationHandler {
private Object target;
private Advice advice;
/**
* 构造方法绑定委托对象及“建议”
*/
BProxy(Object target,Advice advice)
{
this.target = target;
this.advice = advice;
}
public Object getProxy() {
//取得代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(),
target.getClass().getInterfaces(), this); 一//要绑定接口(这是一个缺陷,cglib弥补了这缺陷)
} @Override
/**
* 调用方法
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
//将要对目标进行“加工”的内容进行封装
advice.before();
//执行目标
result=method.invoke(target, args);
advice.after();
return result;
}
}

  4. 代理对目标的加工接口及其实例:

interface Advice
{
void before();
void after();
} class MyAdvice implements Advice
{
public void before(){
System.out.println("前面运行");
}
public void after(){
System.out.println("后面运行");
}
}

  5. 代理测试:

public class TestProxy {  

    public static void main(String[] args) {  

        AInterface BProxy = (AInterface)new BProxy(new BImpl(),new MyAdvice()).getProxy();
BProxy.add();
} }

  

-----------☆-----------ASP.Net+Android+IOS开发.Net培训、期待与您交流! -----------☆-----------

详细请查看: http://edu.csdn.net

黑马程序员:Java编程_动态代理的更多相关文章

  1. 【黑马18期Java毕业生】黑马程序员Java全套资料+视频+工具

        Java学习路线图引言:        黑马程序员:深知广大爱好Java的人学习是多么困难,没视频没资源,上网花钱还老被骗. 为此我们历时一个月整理这套Java学习路线图,不管你是不懂电脑的小 ...

  2. [刘阳Java]_程序员Java编程进阶的5个注意点,别编程两三年还是增删改查

    此文章也是关注网上好几篇技术文章后,今天分享出来.因为,总有在程序学习路上的小伙伴会感到迷茫.而迷茫存在的情况如下 第一种:在大学学习中出现的迷茫,不知道Java到底要学什么.学习Java的标准是什么 ...

  3. 黑马程序员Java基础班+就业班课程笔记全发布(持续更新)

    正在黑马学习,整理了一些课程知识点和比较重要的内容分享给大家,也是给自己拓宽一些视野,仅供大家交流学习,大家有什么更好的内容可以发给我 ,现有黑马教程2000G  QQ 1481135711 这是我总 ...

  4. 黑马程序员——JAVA基础之语法、命名规则

    ------- android培训.java培训.期待与您交流! ---------- 1.java语言组成:关键字,标识符,注释,常量和变量,运算符,语句,函数,数组. 2.java关键字:被Jav ...

  5. 黑马程序员----java基础笔记中(毕向东)

    <p>------<a href="http://www.itheima.com" target="blank">Java培训.Andr ...

  6. 黑马程序员——JAVA基础之泛型和通配符

    ------- android培训.java培训.期待与您交流! ---------- 泛型:            JDK1.5版本以后出现新特性.用于解决安全问题,是一个类型安全机制. 泛型好处: ...

  7. 黑马程序员——JAVA基础之简述面向对象,类,变量,匿名对象

    ------- android培训.java培训.期待与您交流! ---------- 面向对象: 面向对象是相对面向过程而言 面向对象和面向过程都是一种思想 面向过程 强调的是功能行为 面向对象 将 ...

  8. 黑马程序员----java基础:异常

    dff ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 经常写程序的人对try...catch...finally语句肯定是不陌生的了.但是好多 ...

  9. 黑马程序员——JAVA基础之网络编程

    ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 网络编程 网络模型:OSI参考模型和TCP/IP参考模型 网络通讯三要素: IP地址:InetA ...

随机推荐

  1. python简单实现用户表单登录

    实现简单的用户表单验证登录 user="desperado" pwd=" s=0 for i in range(10): if s < 3: username = ...

  2. nRF52系列来袭,Nordic的低功耗蓝牙方案大有可为

      坐落在北欧的挪威不像他的邻居芬兰那样,可以先后依靠NOKIA和愤怒的小鸟在世界科技界享有盛名.在一般人看来,挪威除了一个逐渐式微的Opera浏览器以外,并没有更多拿得出手的科技企业.而事实证明这只 ...

  3. 首师大附中科创教育平台 我的刷题记录 0325 50212228海岛帝国:LYF的太空运输站

    今天给大家献上“D”级题:50212228海岛帝国:LYF的太空运输站!!   试题编号:0325     50212228海岛帝国:LYF的太空运输站 难度级别:D: 运行时间限制:40ms: 运行 ...

  4. git 临时记录

    http://blog.csdn.net/wangbole/article/details/8552808 http://blog.csdn.net/gq414047080/article/detai ...

  5. 类似\u4e0b\u6ce8\u903e\u65f6解码

    HttpUtility.UrlDecode("\u4e0b\u6ce8\u903e\u65f6"); HttpUtility.UrlDecode("\\u5c1a\\u6 ...

  6. HDU-4527 小明系列故事——玩转十滴水 模拟

    题意:就是平时玩的十滴水游戏,游戏者拥有一定的水滴,能够滴在某些位置,如果一个点上的体积超过了4就会爆炸,向四周传递一个小水滴.该题就是要求模拟这个过程. 分析:这里有一个问题就是不能够使用递归来处理 ...

  7. iOS - Git 代码版本管理

    1.Git Git 是用 C 语言开发的分布版本控制系统.版本控制系统可以保留一个文件集合的历史记录,并能回滚文件集合到另一个状态(历史记录状态).另一个状态可以是不同的文件,也可以是不同的文件内容. ...

  8. package

    1.设计package原因 理解基目录的概念,思考jre加载class的顺序,如果没有package会怎么样?有了之后又是怎么样..? 主要:确保类名的唯一性. 次要:方便组织代码 2.怎样访问\导入 ...

  9. zoj3228Searching the String(ac自动机)

    链接 这个题把病毒分为了两种,一种包含可以覆盖,另一种不可以,需要分别求出包含他们的个数,可以把两种都建在一颗tire树上,在最后求得时候判断一下当前节点是属于哪种字符串,如果是不包含的需要判断一下p ...

  10. 浅谈 js字符串 trim 方法之正则篇

    关于 trim 其实没啥好说的,无非就是去除首位空格,对于现代浏览器来说只是简单的正则 /^\s+|\s+$/ 就可以搞定了.而且支持中文空格   等等.什么 \s 支持 中文空格?是的. 打开 Re ...