我们都知道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. Hibernate使用Query进行查询

    错误结果如下 Exception in thread "main" org.hibernate.hql.internal.ast.QuerySyntaxException: new ...

  2. MFC对话框程序 屏蔽ESC和ENTER键关闭对话框的方法

    http://blog.csdn.net/xgx198831/article/details/6713651 MFC对话框程序  屏蔽ESC和ENTER键关闭对话框的方法 或许还有其它更好的办法,但下 ...

  3. studio 配置 opencv3.1

    环境 win10 android studio2.0 OpenCV-3.1.0-android-sdk android-ndk-r10e-windows-x86_64 jdk-8u102-window ...

  4. [Xcode 实际操作]九、实用进阶-(11)系统本地通知的创建和使用

    目录:[Swift]Xcode实际操作 本文将演示系统本地通知的创建和使用. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //引入需要 ...

  5. CZGL.AliIoTClient 文档:说明

    文档目录: 说明 1. 连接阿里云物联网 2. IoT 客户端 3. 订阅Topic与响应Topic 4. 设备上报属性 4.1 上报位置信息 5. 设置设备属性 6. 设备事件上报 7. 服务调用 ...

  6. C# CSV文件的导入导出以及datatable转化csv

    1.csv文件写入操作 首先,创建datatable对象: DataTable dt = new DataTable(); 添加列: dt.Columns.Add("name", ...

  7. zookeeper 搭建

    zookeeper 版本为zookeeper 3.4.8 操作系统为ubuntu 12.04 64位 zookeeper 单机搭建 解压zookeeper 包 .tar.gz -C /root/sof ...

  8. 【UVA - 10815】Andy's First Dictionary (set)

    Andy's First Dictionary Description 不提英文了 直接上中文大意吧 XY学长刚刚立下了再不过CET就直播xx的flag,为了不真的开启直播模式,XY学长决定好好学习英 ...

  9. assembly x86(nasm)画三角形等图形的实现(升级版)

    https://www.cnblogs.com/lanclot-/p/10962702.html接上一篇 本来就有放弃的想法,可是有不愿退而求次, 然后大神室友写了一个集海伦公式计算三角形面积, 三点 ...

  10. C 语言实例 - 计算字符串长度

    C 语言实例 - 计算字符串长度 C 语言实例 C 语言实例 计算字符串长度. 实例 - 使用 strlen() #include <stdio.h> #include <strin ...