java动态代理使用详解
我们都知道AOP的原理就是java的动态代理机制,下面我就对java的动态代理机制进行学习与总结
java动态代理的实现有两个重要的类:
Proxy:类
作用就是用来动态创建一个代理对象的类
InvocationHandler:接口
每一个动态代理类都必须要实现InvocationHandler这个接口,并且每个代理类的实例都关联到了一个handler,当我们通过代理对象调用一个方法的时候,这个方法的调用就会被转发为由InvocationHandler这个接口的 invoke 方法来进行调用。
通过一个例子进行学习与理解:
被代理接口:
package com.zgq.proxy; /**
* @author guoqiang.zhao@insentek.com
* @date 2016/5/25
* 修正历史:
* 2016/5/25:文件创建
*/
public interface IStudy {
void hello(String str);
}
被代理接口的实现类:
package com.zgq.proxy; /**
* @author guoqiang.zhao@insentek.com
* @date 2016/5/25
* 修正历史:
* 2016/5/25:文件创建
*/
public class Study implements IStudy {
@Override
public void hello(String str) {
System.out.println("hello:" + str);
}
}
java动态代理类
package com.zgq.proxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; /**
* @author guoqiang.zhao@insentek.com
* @date 2016/5/25
* 修正历史:
* 2016/5/25:文件创建
*/
public class MyInvocationHandler implements InvocationHandler {
private Object object; public MyInvocationHandler (Object object){
this.object = object;
} /**
*
* @param proxy 被代理的对象
* @param method 被代理对象的方法
* @param args 被代理对象方法的参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("A===================================");
method.invoke(object,args);
System.out.println("B===================================");
return null;
}
}
测试类:
package com.zgq.proxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; /**
* @author guoqiang.zhao@insentek.com
* @date 2016/5/25
* 修正历史:
* 2016/5/25:文件创建
*/
public class Test {
public static void main(String[] args) {
Study study = new Study();
InvocationHandler invocationHandler = new MyInvocationHandler(study);
//Proxy.newProxyInstance用来动态创建一个代理对象的类
//study.getClass().getClassLoader() 定义代理类的加载器
//study.getClass().getInterfaces() 被代理对象实现的接口
//invocationHandler 代理对象调用方法时会调用实现此类的子类的invoke方法
IStudy iStudy = (IStudy) Proxy.newProxyInstance(study.getClass().getClassLoader(),study.getClass().getInterfaces(),invocationHandler);
iStudy.hello("zgq");
}
}
执行结果:
A===================================
hello:zgq
B=================================== Process finished with exit code 0
通过以上例子对java的动态代理机制有了一定的了解;
IStudy iStudy = (IStudy) Proxy.newProxyInstance(study.getClass().getClassLoader(),study.getClass().getInterfaces(),invocationHandler);
执行这句代码的时候会通过反射机制生成一个代理类,该类实现了IStudy接口,并且重写了接口里面的方法,在该代理类里面有一个InvocationHandler类型的成员变量,也就是调用处理程序,通过调用处理程序来给被代理类增强功能。创建好代理类后就调用类加载器将该类加载到内存,然后再通过反射创建一个该代理类的实例对象。
java动态代理使用详解的更多相关文章
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Java动态代理 深度详解
代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...
- Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- Java 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- Java动态代理机制详解(类加载,JDK 和CGLIB,Javassist,ASM)
class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...
- Java 反射 设计模式 动态代理机制详解 [ 转载 ]
Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...
- 【转】java的动态代理机制详解
java的动态代理机制详解 在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们 ...
- java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
随机推荐
- CV_Assert
转:http://blog.csdn.net/ding977921830/article/details/46376847 Checks a condition at runtime and thro ...
- 2.5 Hive中外部表的讲解
一.外部表 1.hive中表的类型 管理表 托管表(外部表) #内部表 >内部表也称之为MANAGED_TABLE: >默认存储在/user/hive/warehouse下,也可以通过lo ...
- 【Data Structure & Algorithm】求子数组的最大和
求子数组的最大和 题目:输入一个整型数组,数组里有正数和负数.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和.求所有子数组的和的最大值,要求时间复杂度为O(n).例如输入数组为1, - ...
- javascript runat server
<script runat="server"> protected void SubmitBtn_Click(object sender, EventArgs e) { ...
- .NET开发人员如何开始使用ML.NET
随着谷歌,Facebook发布他们的工具机器学习工具Tensorflow 2和PyTorch ,微软的CNTK 2.7之后不再继续更新(https://docs.microsoft.com/zh-cn ...
- (水题)Codeforces - 4C - Registration system
https://codeforces.com/problemset/problem/4/C 用来哈希的一道题目,用map也可以强行过,但是性能慢了6倍,说明是在字符串比较的时候花费了接近6倍的时间. ...
- unity3d 在UGUI中制作自适应调整大小的滚动布局控件
http://blog.csdn.net/rcfalcon/article/details/43459387 在游戏中,我们很多地方需要用到scroll content的概念:我们需要一个容器,能够指 ...
- 3DMAX 3场景制作
1 模型制作 2 UVW贴图展开 1 打开材质编辑器,给模型一个材质(以后应该以这个材质生成uvw展开,进而生成贴图,贴图绘制完毕后,再贴回这个材质中,就完成了给模型加贴图的操作) 2 在编辑面板中添 ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术原理
Cookie使用HTTPHeader传递数据.Cookie机制定义了两种报头,Set-Cookie报头和Cookie报头.Set-Cookie报头包含于Web服务器的响应头(ResponseHeade ...
- XHTML学习笔记 Part3:核心属性
1. 3个属性组: 核心属性:class.id 和title属性 国际化属性:dir.lang和xml:lang属性 UI事件:与如下事件关联的属性: onclick.ondoubleclick.on ...