先来看一下思维导图:

对于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. ContextLoaderListener错误

    在web.xml中添加如下配置 <context-param> <param-name>contextConfigLocation</param-name> < ...

  2. 循环Gray码的生成(非递归)

    #!/usr/bin/env python #coding:utf-8 import sys def gray_code(n): if n < 1: return [] n += 1 array ...

  3. ARM编程模式和7钟工作模式

    一. ARM的基本设定 1.1. ARM 采用的是32位架构 1.2. ARM约定: a. Byte : 8 bits b. Halfword :16 bits (2 byte) c. Word : ...

  4. Y7000 安装ubuntu16.04.6 的tips :禁用nouveau 、Wifi 问题 、nvidia 驱动安装

    由于最近要跑DeepLearning 所以在自己的Y7000上装一个Ubuntu ,自己碰了好多壁 写下来以防止自己忘掉以便后续再用! 配置:i7-8750H +GeForce GTX 1050Ti ...

  5. 1、Java语言概述与开发环境——JDK JRE JVM理解

    一.理解概念: 1.JDK(Java Development Kit Java开发工具包) JDK是提供给Java开发人员使用的,其中包含Java的开发工具,也包括JRE,所以安装了JDK,就不用单独 ...

  6. git 中 HEAD detached from 802e836

    head指针处于游离状态,需要建立一个分支然后将它合并到master分支,最后删除那个临时分支即可. 详情参见:https://www.jianshu.com/p/fdd3c2d020d7

  7. vue项目引入外部字体

    1.UI设计图有"华文黑体",担心客户端没有该字体,将"huawen.ttf"字体文件,放入项目中: 2.创建一个font.scss(或font.css)文件: ...

  8. mailaddr - 关于邮件地址的描述

    DESCRIPTION 描述 本手册给出的是 Internet 使用的 SMTP 邮件地址的简要描述.这些地址的通常的格式是 user@domain 这里的域 (domain) 是分级的子域的列表,子 ...

  9. Educational Codeforces Round 32 Almost Identity Permutations CodeForces - 888D (组合数学)

    A permutation p of size n is an array such that every integer from 1 to n occurs exactly once in thi ...

  10. unkown类型

    1,任何类型的值都可以赋给 unkown类型 2. 如果没有类型断言或基于控制流的类型细化时 unknown 不可以赋值给其它类型,此时它只能赋值给 unknown 和 any 类型 3. 如果没有类 ...