我们都知道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动态代理使用详解的更多相关文章

  1. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

  2. Java动态代理 深度详解

    代理模式是设计模式中非常重要的一种类型,而设计模式又是编程中非常重要的知识点,特别是在业务系统的重构中,更是有举足轻重的地位.代理模式从类型上来说,可以分为静态代理和动态代理两种类型. 今天我将用非常 ...

  3. Java动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  4. Java 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  5. Java动态代理机制详解(类加载,JDK 和CGLIB,Javassist,ASM)

    class文件简介及加载 Java编译器编译好Java文件之后,产生.class 文件在磁盘中.这种class文件是二进制文件,内容是只有JVM虚拟机能够识别的机器码.JVM虚拟机读取字节码文件,取出 ...

  6. Java 反射 设计模式 动态代理机制详解 [ 转载 ]

    Java 反射 设计模式 动态代理机制详解 [ 转载 ] @author 亦山 原文链接:http://blog.csdn.net/luanlouis/article/details/24589193 ...

  7. 【转】java的动态代理机制详解

    java的动态代理机制详解   在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们 ...

  8. java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html

    java的动态代理机制详解-----https://www.cnblogs.com/xiaoluo501395377/p/3383130.html

  9. java的动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

随机推荐

  1. Java--23种设计模式之decorator模式

    装饰模式:装饰模式以对客户端透明的方式扩展对象的功能,是继承关系的一个替代方案,提供比继承更多的灵活性.动态给一个对象增加功能,这些功能可以再动态的撤消.增加由一些基本功能的排列组合而产生的非常大量的 ...

  2. 各浏览器userAgent汇总

    浏览器  navigator.userAgent  备注  IE6  Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)   IE7  Mo ...

  3. Resistance

    题意: 给出一个由n个节点和m个二元电阻元件组成的电路,求问节点1到节点n的等效电阻. 解法: 应用电子电路分析中的基尔霍夫定律,对于每一个点有流量平衡,得 对于点$x$有 $$I_{出} + \su ...

  4. jquery快速入门三

    事件 常用事件 click(function(){.......}) #触发或将函数绑定到指定元素的click事件 hover(function(){.....}) 当鼠标指针悬停在上面时触发.... ...

  5. liteos任务(二)

    任务 1 基本概念 从系统的角度看,任务是竞争系统资源的最小运行单元.任务可以使用或等待CPU.使用内存空间等系统资源,并独立于其它任务运行. Huawei LiteOS的任务模块可以给用户提供多个任 ...

  6. 16-CoreData之多表关联(存储自定义数据模型)

    多表关联 1.1-简介 什么是多表关联 在处理数据库的关系中,无非只有三种关系 一对一:一个老师只能在一个教室上课,不可能同时在两个教室上课 一对多:一个教室可以有多个学生,但一个学生只能在一个教室 ...

  7. 基于thinkphp5的Excel上传

    涉及知识点: thinkphp5.0: excel上传: mysql建立新表(基本的create语句): mysql ignore(避免重复插入): 主要功能: 通过在视图中上传excel文件,在my ...

  8. Mol Cell Proteomics. |彭建祥| 人胃肠道间质瘤亚群蛋白质组图谱

    大家好,本周分享的是发表在Molecular & Cellular Proteomics 上的一篇关于人胃肠道间质瘤亚群蛋白质组图谱的文章,题目是Proteomic maps of human ...

  9. golang开发:(二)安装 Golang

    当然了我们的安装都是在vagrant里面安装,vagrant ssh.不用虚拟机了,本机安装当然也可以. Mac 安装 访问下载地址,下载 go1.12.5.darwin-amd64.pkg,双击下载 ...

  10. css定位-position

    前言 定位的目的就是把元素摆放到指定的位置. 定位上下文:定位元素的大小,位置都是相对于定位上下文的. position属性值有5个值 static:所有有元素定位默认的初始值都是static.就是不 ...