设计模式之动态代理(Java的JDK动态代理实现)
先来看一下思维导图:

对于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动态代理实现)的更多相关文章
- 浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance
浅谈Java代理一:JDK动态代理-Proxy.newProxyInstance java.lang.reflect.Proxy:该类用于动态生成代理类,只需传入目标接口.目标接口的类加载器以及Inv ...
- 深度剖析java中JDK动态代理机制
https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...
- Spring的两种代理方式:JDK动态代理和CGLIB动态代理
代理模式 代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对 ...
- Spring代理模式(jdk动态代理模式)
有动态代理和静态代理: 静态代理就是普通的Java继承调用方法. Spring有俩种动态代理模式:jdk动态代理模式 和 CGLIB动态代理 jdk动态代理模式: 代码实现: 房东出租房子的方法(继承 ...
- Java基础-JDK动态代理
JDK的动态代理依靠接口实现 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代 ...
- [编织消息框架][JAVA核心技术]jdk动态代理
需要用到的工具 jdk : javac javap class 反编译 :JD-GUI http://jd.benow.ca/ import java.lang.reflect.Invocation ...
- java之JDK动态代理
© 版权声明:本文为博主原创文章,转载请注明出处 JDK动态代理: JDK动态代理就是在程序运行期间,根据java的反射机制自动的帮我们生成相应的代理类 优势: - 1. 业务类只需要关注业务逻辑本身 ...
- Java中如何实现代理机制(JDK动态代理和cglib动态代理)
http://blog.csdn.net/skiof007/article/details/52806714 JDK动态代理:代理类和目标类实现了共同的接口,用到InvocationHandler接口 ...
- Java基础-jdk动态代理与cglib动态代理区别
JDK动态代理 此时代理对象和目标对象实现了相同的接口,目标对象作为代理对象的一个属性,具体接口实现中,可以在调用目标对象相应方法前后加上其他业务处理逻辑. 代理模式在实际使用时需要指定具体的目标对象 ...
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
spring-aop-4.3.7.RELEASE 在<Spring AOP高级——源码实现(1)动态代理技术>中介绍了两种动态代理技术,当然在Spring AOP中代理对象的生成也是运用 ...
随机推荐
- 分享一个linux中测试网站是否正常的shell脚本
#! /bin/bash #Author=Harry CheckUrl() { #<==定义函数,名字为CheckUrl timeout=5 #<==定义wget访问的超时时间,超时就退出 ...
- 索引之----mysql联合索引
重要概念: 1.对于mysql来说,一条sql中,一个表无论其蕴含的索引有多少,但是有且只用一条. 2.对于多列索引来说(a,b,c)其相当于3个索引(a),(a,b),(a,b,c)3个索引,又由于 ...
- 剑指Offer编程题(Java实现)——链表中倒数第k个结点
题目描述 输入一个链表,输出该链表中倒数第k个结点. 注意: 该题目不可以用先反转链表再输出第k个结点的方式,因为反转链表会改变该结点的next指向 思路一 使用栈Stack倒序存储,顺序pop第k个 ...
- QButtonGroup
单选按钮和多选按钮,存放进QButtonGroup中 QButtonGroup方法来实现分组:将相同功能的按键,设为一个分组,然后可以进行 单选 或 多选 或 互斥单选 QAbstractButton ...
- 2019 安洵杯 Re 部分WP
0x01.EasyEncryption 测试文件:https://www.lanzous.com/i7soysb 1.IDA打开 int sub_416560() { int v0; // eax i ...
- mac安装卸载brew
1.安装 访问https://brew.sh,copy图中的命令到命令行中,进行下载安装 2.卸载 官方版本的卸载: /usr/bin/ruby -e "$(curl -fsSL https ...
- Tomcat启动慢的原因及解决方法
Tomcat启动慢的原因及解决方法 在CentOS启动Tomcat时,启动过程很慢,需要几分钟,经过查看日志,发现耗时在这里:是session引起的随机数问题导致的.Tocmat的Session ID ...
- SPSS25 下载安装和激活
目录 1. 其他版本 2. 安装步骤 3. 下载地址 1. 其他版本 参考:https://www.cnblogs.com/coco56/p/11648399.html 2. 安装步骤 打开安装包 下 ...
- 02java基础——类和方法
1.类的定义 /* 定义类: 使用类的形式,对现实中的事物进行描述 事物: 属性,方法 属性: 变量 方法: 这个事物具备的功能 格式: public class 类名{ 属性定义 修饰符 数据类型 ...
- JAVA的深浅拷备
package com.jd.ng.shiro.testFactory; import java.io.*; /** * @author wangzhilei * @Author: husToy.Wa ...