java中的动态代理机制
java中的动态代理机制
在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface)、另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的。下面通过代码来学习java中的动态代理技术.
首先定义一个接口:
package com.aop.spring;
/**
* Created by xinfengyao on 16-2-29.
*/
public interface Perform {
public void play();
}
实现该接口:
package com.aop.spring;
/**
* Created by xinfengyao on 16-2-29.
*/
public class Actor implements Perform {
@Override
public void play() {
System.out.println("开始表演");
}
}
实现InvocationHandler:
package com.aop.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
* Created by xinfengyao on 16-2-29.
*/
public class MyHandler implements InvocationHandler { // 这个就是我们想要代理的真实对象
Perform performer;
public MyHandler(Perform performer) {
this.performer = performer;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { // 在代理的真实对象执行操作前, 我们可以执行自己的操作
System.out.println("表演开始之前,开灯"); // 真实对象执行操作
Object object = method.invoke(performer, args);
//在真实对象执行完操作后, 我们也可以加上我们自己的操作
System.out.println("表演结束, 关灯");
return object;
}
}
创建代理,调用方法:
package com.aop.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;
/**
* Created by xinfengyao on 16-2-29.
*/
public class ProxyDemo {
public static void main(String[] args) {
Perform performer = new Actor();
InvocationHandler handler = new MyHandler(performer);
Perform proxy = (Perform) Proxy.newProxyInstance(performer.getClass().getClassLoader(), performer.getClass().getInterfaces(), handler);
proxy.play();
}
}
运行结果:
表演开始之前,开灯 开始表演 表演结束, 关灯
首先需要创建委托类对象,也就是我们想要代理的对象, 例如实例中的performer, 将其以构造函数传入代理处理器,代理处理器ProxyHandler中会以Java反射方式调用该委托类对应的方法。然后使用 Java反射机制中的Proxy.newProxyInstance方式创建一个代理类实例,创建该实例需要指定该实例的类加载器,需要实现的接口(即目 标接口),以及处理代理实例接口调用的处理器。
最后,调用代理类目标接口方法时,会自动将其转发到代理处理器中的invoke方法内,invoke方法内部实现预处理,对委托类方法调用,事后处理等逻辑。
java中的动态代理机制的更多相关文章
- 深度剖析java中JDK动态代理机制
https://www.jb51.net/article/110342.htm 本篇文章主要介绍了深度剖析java中JDK动态代理机制 ,动态代理避免了开发人员编写各个繁锁的静态代理类,只需简单地指定 ...
- java反射中的动态代理机制(有实例)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- 使用Java中的动态代理实现数据库连接池
2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- 十分钟理解Java中的动态代理
十分钟理解 Java 中的动态代理 一.概述 1. 什么是代理 我们大家都知道微商代理,简单地说就是代替厂家卖商品,厂家“委托”代理为其销售商品.关于微商代理,首先我们从他们那里买东西时通常不知道 ...
- 一文读懂Java中的动态代理
从代理模式说起 回顾前文: 设计模式系列之代理模式(Proxy Pattern) 要读懂动态代理,应从代理模式说起.而实现代理模式,常见有下面两种实现: (1) 代理类关联目标对象,实现目标对象实现的 ...
- java中的动态代理
1.动态代理的定义:为其他对象提供一个代理以控制对这个对象的访问 2.通过api看下proxy生成代理类的2中写法: 创建某一接口 Foo 的代理: InvocationHandler handler ...
- 使用 JAVA 中的动态代理实现数据库连接池
数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的连接数据库对服务性能来讲是一个瓶颈,使用缓冲池技术可以来消除这个瓶颈.我们可以在互联网上找到很多关于数据库连接池的源程序,但是都发现这样一个共 ...
- Java中的动态代理以及Proxy类的偷瞄
动态代理机制 所谓动态代理,即通过代理类Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. Java动态代理类位于Java.lang.reflect包 ...
随机推荐
- Summary: Process & Tread
refer to http://www.programmerinterview.com/index.php/operating-systems/thread-vs-process/ A process ...
- Java相对路径读取文件
不管你是新手还是老鸟,在程序中读取资源文件总会遇到一些找不到文件的问题,这与Java底层的实现有关,不能算bug,只要方法得当,问题还是可以解决的. 项目的文件夹结构: repathtest ├─sr ...
- 【Origin】 破阵子-未可留 征人调
几朝岁月,悠悠,容颜改,两鬓衰,可恨荣光不留! 一生事,忧心畔,可怜惶惶,不拿年岁当缠头: 只把扑朔往往,人生几回首: 等闲识得料峭处,一腔泪流: 曾记否,三十功名尘与土,不可解忧愁: 青春换得明日花 ...
- sdutoj 2604 Thrall’s Dream
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=2604 Thrall’s Dream Time ...
- csuoj 1395: Timebomb
http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1395 1395: Timebomb Time Limit: 1 Sec Memory Limit ...
- 1029 C语言文法
program -> external_declaration | program external_declaration <程序> -> <外部声明> ...
- oracle 的索引
一.索引分类 按逻辑分: 单列索引(Single column): 单列索引是基于单列所创建的索引 复合(多列)索引(Concatenated ): 复合索引是基于两列或者多列所创建的索引 ...
- 夺命雷公狗—angularjs—4—继承和修正继承
angularjs 中也有继承的方法,废话不多说,看代码: <!doctype html> <html lang="en"> <head> &l ...
- zw版【转发·台湾nvp系列Delphi例程】CheckDifference1
zw版[转发·台湾nvp系列Delphi例程]CheckDifference1 procedure TForm1.Button1Click(Sender: TObject);var img, img1 ...
- java - Annotation元数据
Annotation元数据(一) 一.Annotation究竟是什么? 是java5.0中的新特征 数据的数据(元数据) Annotation和访问修饰符一样,应用于包.类型.构造方法.方法.成员变量 ...