先来看一下思维导图:

对于JDK的动态代理,孔浩老师说学习的方法是把它记下来。

先写一个主题接口类,表示要完成的一个主题。

package com.liwei.dynaproxy;
/**
* 要代理的主题接口
* @author Administrator
*
*/
public interface Subject {
public void miai();
}

再写一个实现类,这个实现类实现这个接口。当然,这个实现类就是我们要代理的对象。

为了区别不同的类的对象,我们为 Person 类增加了一个 name 属性,并且通过构造函数将 name 属性值“注入”,这里是初学者比较难理解的地方,其实多写几遍也就明白了。

package com.liwei.dynaproxy;

/**
* 被代理的对象
*
* @author Administrator
*
*/
public class Person implements Subject {
private String name; public Person(String name) {
super();
this.name = name;
} public void miai() {
System.out.println(name + "正在相亲中。。。");
} }

接下来,写我们的动态代理类。

注意:动态代理类要实现 JDK 的 InvocationHandler 接口,实现 invoke 方法。

其中,成员变量 Object target 代表被代理的对象。同样地,也是通过动态代理类的构造函数注入进来。

强调:invoke方法的第1个参数Object proxy一般不使用。

package com.liwei.dynaproxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* 动态代理类,这是一个处理器
*
* @author Administrator
*
*/ public class DynaProxy implements InvocationHandler {
private Object target; // 被代理对象 public DynaProxy(Object target) {
super();
this.target = target;
} public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object object =null;
System.out.println("前置通知。。。");
object = method.invoke(target, args);
System.out.println("返回通知。。。");
return object;
} }

最后,我们写一个测试类。

package com.liwei.dynaproxy;

import java.lang.reflect.Proxy;

public class Test {
public static void main(String[] args) {
Person p = new Person("彭丽媛");
DynaProxy dynaProxy = new DynaProxy(p);
// Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
// 动态生成代理对象(类加载器,被代理接口,InvocationHandler)
Subject s=(Subject)Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass()
.getInterfaces(), dynaProxy);
s.miai();
}
}

源代码:JDK的动态代理源代码.rar

设计模式之动态代理(Java的JDK动态代理实现)的更多相关文章

  1. 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance

    浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...

  2. 深度剖析java中JDK动态代理机制

    https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...

  3. Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对 ...

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

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

  5. Java基础-JDK动态代理

    JDK的动态代理依靠接口实现  代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代 ...

  6. [编织消息框架][JAVA核心技术]jdk动态代理

    需要用到的工具  jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.Invocation ...

  7. java之JDK动态代理

    © 版权声明:本文为博主原创文章,转载请注明出处 JDK动态代理: JDK动态代理就是在程序运行期间,根据java的反射机制自动的帮我们生成相应的代理类 优势: - 1. 业务类只需要关注业务逻辑本身 ...

  8. Java中如何实现代理机制(JDK动态代理和cglib动态代理)

    http://blog.csdn.net/skiof007/article/details/52806714 JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口 ...

  9. Java基础-jdk动态代理与cglib动态代理区别

    JDK动态代理 此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑. 代理模式在实际使用时需要指定具体的目标对象 ...

  10. Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程

    spring-aop-4.3.7.RELEASE  在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...

随机推荐

  1. SQL Server中的扩展事件学习系列

    SQL Server 扩展事件(Extented Events)从入门到进阶(1)——从SQL Trace到Extented Events SQL Server 扩展事件(Extented Event ...

  2. Tensorflow模型保存与加载

    在使用Tensorflow时,我们经常要将以训练好的模型保存到本地或者使用别人已训练好的模型,因此,作此笔记记录下来. TensorFlow通过tf.train.Saver类实现神经网络模型的保存和提 ...

  3. 自动构建War包的Ant build.xml模板

    <?xml version="1.0" encoding="UTF-8" ?> <project name="[*****]你的项目 ...

  4. 【ES6】迭代器与可迭代对象

    ES6 新的数组方法.集合.for-of 循环.展开运算符(...)甚至异步编程都依赖于迭代器(Iterator )实现.本文会详解 ES6 的迭代器与生成器,并进一步挖掘可迭代对象的内部原理与使用方 ...

  5. ☆☆☆☆☆Placeholder兼容各大浏览器的例子☆☆☆☆☆

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  6. vue elementui 切换语言

    1.安装插件:npm install vue-i18n  --save 2.src下新建i18n文件夹, i18n文件夹下创建langs文件夹和i18n.js文件 langs文件夹下创建cn.js; ...

  7. php 操作分表代码

    //哈希分表 function get_hash_table($table, $userid) { $str = crc32($userid); if ($str < 0) { $hash = ...

  8. 05.Linux系统-WCP知识共享平台安装部署(旗舰版)

    WCP知识共享平台部署 一.环境准备 操作系统:CentOS Linux release 7.5.1804 (Core) Java:jdk-7u79-linux-x64.tar.gz 中间件:apac ...

  9. JS深度比较两个对象是否相等

    /** * 深度比较两个对象是否相等 * @type {{compare: compareObj.compare, isObject: (function(*=): boolean), isArray ...

  10. python3-使用__slots__

    正常情况下,当我们定义了一个class,创建了一个class的实例后,我们可以给该实例绑定任何属性和方法,这就是动态语言的灵活性.先定义class: class Student(object): pa ...