关于代理模式和动态代理参考自:https://www.cnblogs.com/gonjan-blog/p/6685611.html

这里通过参考博客中的例子整理个人理解。

代理模式:

访问某个类的方法由直接调用方法,变为通过中间人练习。

即调用方➡功能提供者,变更为调用方➡代理人➡功能提供者。

这样做的好处:

1.调用方不再关注功能提供者的具体行为,专为代理人统一关注,调用方只用关注代理人的行为(接口)。

2.代理人可以在真正调用功能提供者的方法前后进行再加工提供部分行为。

静态代理:

在编译阶段已经知道代理人、功能提供者、调用方的关系。

动态代理:

代理人在编译阶段不知道调用方和功能提供者的类型,在运行时通过传入的参数动态建立代理关系。

因此动态代理的加工行为可以对拥有被代理人临时生效,比如计算任何功能提供者执行方法的时间。。

以下是例子:

静态代理:

Person接口代表所有学生,所有学生都有交班费的行为

package com.xdsux.java.proxy;

public interface Person {
//静态代理与功能提供者的统一接口
void giveMoney();
}

Student实现了Person接口的交班费行为:

package com.xdsux.java.proxy;

public class Student implements Person {

    @Override
public void giveMoney() {
System.out.println("学生提交班费:50"); } }

Monitor即代理(班长),班长可以找任何学生提交班费:

package com.xdsux.java.proxy;

public class Monitor implements Person {
//班长即代理,持有学生实例
Student stu; public Monitor(Person stu) {
this.stu = (Student)stu;
} @Override
public void giveMoney() {
//班长叫学生交班费
stu.giveMoney();
} }

测试,也就是老师叫班长去收班费:

package com.xdsux.java.proxy;

public class TestProxy {
public static void main(String[] args) {
//某学生
Student stu = new Student();
//某班长
Monitor mon = new Monitor(stu);
mon.giveMoney();
}
}

1.班长可以向任何一个学生收班费,在收取班费时可以加入其他动作,比如查询学生上次是否未交。

2.班长可以采用单例模式(一个班只有一个班长)

3.学生的缴费行为可以变动(学生出现子类贫困生,可能不需要交班费),但老师不必关心,班长负责和学生重新确定缴费行为,老师可以依然调用mon.giveMoney

动态代理

代理类需要实现InvovationHabdler接口:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class StuInvocationHandler<T> implements InvocationHandler { // 事先不知道代理谁
T target; public StuInvocationHandler(T target) {
this.target = target;
} /**
* proxy:代理动态对象 method:代表需要执行的方法 args:调用目标方法时要传入的参数
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("代理执行" + method.getName() + "方法");
// 代理过程中插入监测方法,计算该方法耗时
MonitorUtil.start();
Object result = method.invoke(target, args);
MonitorUtil.finish(method.getName());
return result;
} }

代理会根据传入的实例和参数执行方法,并在每次代理时,计算目标方法的执行时间:

package com.xdsux.java.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class TestProxy {
public static void main(String[] args) {
//某学生
Student stu = new Student(); //创建一个与代理对象相关联的InvocationHandler
InvocationHandler stuHandler = new StuInvocationHandler<Person>(stu); //创建一个代理对象stuProxy来代理某学生,代理对象的每个执行方法都会替换执行Invocation中的invoke方法
Person stuProxy = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(), new Class<?>[]{Person.class}, stuHandler);
//代理执行上交班费的方法
stuProxy.giveMoney();
}
}

【Java】代理模式、反射机制-动态代理的更多相关文章

  1. Java反射机制动态代理

    1.什么事反射机制动态代理 在一段代码的前后动态执行其他操作,比如有一个方法是往数据库添加一个记录,我们可以通过动态代理,在操作数据库方法的前和后添加代码执行打开数据库连接和关闭数据库连接. 2.演示 ...

  2. Spring代理模式(jdk动态代理模式)

    有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...

  3. Java高级特性—反射和动态代理

    1).反射 通过反射的方式可以获取class对象中的属性.方法.构造函数等,一下是实例: 2).动态代理 使用场景: 在之前的代码调用阶段,我们用action调用service的方法实现业务即可. 由 ...

  4. 代理模式之cglib动态代理

    上一篇博客说了实现InvocationHandler接口的jdk动态代理,还有一种实现动态代理的方式则是:通过继承的方式实现的cglib动态代理. 先在程序中导入cglib的包,cglib-nodep ...

  5. 代理模式及jdk动态代理原理

    代理模式 :为其它对象提供代理,以控制对这个对象的访问. 代理模式的特征:代理类(proxyClass)与委托类(realClass)有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转 ...

  6. Java基础之反射和动态代理

    1,反射是依赖于Class对象,然后根据Class对象,去操作该类的资源的.Class对象是发射的基石! 问题1:人这类事物用什么表示?汽车这类事物用什么表示>计算机文件用什么表示?有如此多的事 ...

  7. java 27 - 9 反射之 动态代理的概述和实现

    代理:本来应该自己做的事情,却请了别人来做,被请的人就是代理对象. 举例:春季回家买票让人代买 动态代理: 在程序运行过程中产生的这个对象 而程序运行过程中产生对象其实就是我们刚才反射讲解的内容,所以 ...

  8. java 代理模式二:动态代理

    java动态代理: java动态代理类位于java.lang.reflect包下,一般主要涉及两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法:Objec ...

  9. java 27 - 10 反射之 动态代理的代码实现

    为什么要写动态代理类? 例子: 如果现在想做个登陆注册的功能.用户可以执行登陆.注册.添加.删除这些功能. 但是,有些功能是要有一定权限才可以执行的. 而现在已经有了个用户类的接口和该类的实现类了,但 ...

随机推荐

  1. os.rename 和os.replace

    f1 = open("hello.txt","w") f1.write("hello,my name is bobo.") f1.close ...

  2. 对pytorch中Tensor的剖析

    不是python层面Tensor的剖析,是C层面的剖析. 看pytorch下lib库中的TH好一阵子了,TH也是torch7下面的一个重要的库. 可以在torch的github上看到相关文档.看了半天 ...

  3. 几种不同格式的json解析

    原文地址:http://blog.csdn.net/whx405831799/article/details/42171191 给服务端发送请求后,服务端会返回一连串的数据,这些数据在大部分情况下都是 ...

  4. 应用程序与驱动程序通信 DeviceIoControl

    之前写过一篇关于通过DeviceIoControl函数来使应用程序与驱动程序通信的博客,这次再通过这个完整的代码来简要疏通总结一下. 这种通信方式,就是驱动程序和应用程序自定义一种IO控制码,然后调用 ...

  5. Linux背背背(1)

    目录: 1.文件目录 2.基本语法 3.centos7之后的版本中查看ip地址 4.~ 5.修改时间 ------------------------------------------------- ...

  6. centos 全局环境变量设置

    CentOS的环境变量配置文件体系是一个层级体系,这与其他多用户应用系统配置文件是类似的,有全局的,有用户的,有shell的,另外不同层级有时类似继承关系.下面以PATH变量为例. 1.修改/etc/ ...

  7. 实验三:xen环境下的第一个虚拟机的安装

    实验名称: xen环境下的第一个虚拟机的安装 实验环境: 我们这里继续上面实验二来完成这个实验: 环境则是xen的安装环境,如下图: 开启虚拟机的的硬件辅助虚拟化功能: 实验要求: 这里我们通过安装b ...

  8. 关于报错:There is already 'xxxController' bean method的解决方法

    报这个错的原因是因为你controller里的@RequestMapping中的路径有重复! 如:

  9. python3之os、sys

    os模块 # 显示当前使用平台:"nt":windows;"posix":Linux >>> os.name 'nt' # 当前工作目录 &g ...

  10. Android 开发 VectorDrawable 矢量图 (二)了解矢量图属性与绘制

    VectorDrawable 矢量图 三部曲: Android 开发 VectorDrawable 矢量图 (一)了解Android矢量图与获取矢量图 Android 开发 VectorDrawabl ...