java.lang.reflect.Proxy#newProxyInstance

    public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)throws IllegalArgumentException{/** Look up or generate the designated proxy class.*///创建了一个class 对象,继承自指定借口Class<?> cl = getProxyClass0(loader, intfs);/** Invoke its constructor with the designated invocation handler.*/final Constructor<?> cons = cl.getConstructor(constructorParams);final InvocationHandler ih = h;//调用该对象的构造函数  同时把InvocationHandler 传递过去return cons.newInstance(new Object[]{h});
}

需要动态代理的接口


/*** 需要动态代理的接口*/
public interface Subject
{/*** 你好** @param name* @return*/public String SayHello(String name);/*** 再见** @return*/public String SayGoodBye();
}

我们看下生成的代理类是什么样子的:

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.lang.reflect.UndeclaredThrowableException;
import jiankunking.Subject;public final class ProxySubjectextends Proxyimplements Subject
{private static Method m1;private static Method m3;private static Method m4;private static Method m2;private static Method m0;public ProxySubject(InvocationHandler paramInvocationHandler){super(paramInvocationHandler);}public final boolean equals(Object paramObject){try{return ((Boolean)this.h.invoke(this, m1, new Object[] { paramObject })).booleanValue();}catch (Error|RuntimeException localError){throw localError;}catch (Throwable localThrowable){throw new UndeclaredThrowableException(localThrowable);}}public final String SayGoodBye(){try{return (String)this.h.invoke(this, m3, null);}catch (Error|RuntimeException localError){throw localError;}catch (Throwable localThrowable){throw new UndeclaredThrowableException(localThrowable);}}public final String SayHello(String paramString){try{return (String)this.h.invoke(this, m4, new Object[] { paramString });}catch (Error|RuntimeException localError){throw localError;}catch (Throwable localThrowable){throw new UndeclaredThrowableException(localThrowable);}}public final String toString(){try{return (String)this.h.invoke(this, m2, null);}catch (Error|RuntimeException localError){throw localError;}catch (Throwable localThrowable){throw new UndeclaredThrowableException(localThrowable);}}public final int hashCode(){try{return ((Integer)this.h.invoke(this, m0, null)).intValue();}catch (Error|RuntimeException localError){throw localError;}catch (Throwable localThrowable){throw new UndeclaredThrowableException(localThrowable);}}static{try{m1 = Class.forName("java.lang.Object").getMethod("equals", new Class[] { Class.forName("java.lang.Object") });m3 = Class.forName("jiankunking.Subject").getMethod("SayGoodBye", new Class[0]);m4 = Class.forName("jiankunking.Subject").getMethod("SayHello", new Class[] { Class.forName("java.lang.String") });m2 = Class.forName("java.lang.Object").getMethod("toString", new Class[0]);m0 = Class.forName("java.lang.Object").getMethod("hashCode", new Class[0]);return;}catch (NoSuchMethodException localNoSuchMethodException){throw new NoSuchMethodError(localNoSuchMethodException.getMessage());}catch (ClassNotFoundException localClassNotFoundException){throw new NoClassDefFoundError(localClassNotFoundException.getMessage());}}
}

总结:

我们使用动态代理的时候,会根据接口创建一个class,这个class 继承自proxy, 该类构造函数里面需要传递一个InvocationHandler, 每当调用接口的方法的时候,会调用到生成类的方法,生成类会调用InvocationHandler.

问:InvocationHandler 怎么传递给创建的类?
通过构造方法。

参考:
https://blog.csdn.net/jiankunking/article/details/52143504

Java 动态代理原理相关推荐

  1. Java 动态代理原理图解 (附:2种实现方式详细对比)

    动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 Ja ...

  2. java动态代理原理及解析

    转载自 http://blog.csdn.net/scplove/article/details/52451899 代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制 ...

  3. java动态代理原理

    代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过 ...

  4. java动态代理原理解析

    总结:一.应用:1.要代理的类必须有对应实现接口.2.被增强的代码要实现invocationHandle接口,实现接口的invoke方法,在方法里添加增强代码和通过调用method.invoke( p ...

  5. Java动态代理原理分析

    JDK动态代理原理分析 interface Foo {void foo(); }class Target implements Foo {@Overridepublic void foo() {Sys ...

  6. java动态代理原理剖析

    首先来谈为什么需要代理. 比如我有一个接口如下 public interface Moveable {void move();} 它有一个move方法.现在我有这样一个需求,当我要通过子类实现该接口调 ...

  7. Java 动态代理 原理解析

    概要 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常 ...

  8. 【Java基础知识 14】java动态代理原理

  9. 深入理解Java Proxy和CGLIB动态代理原理

    点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...

最新文章

  1. ceph 部署单机集群
  2. content 内容生成技术2
  3. 10锁屏幻灯片_手机跟我学第一百八十八课——如何设置锁屏
  4. 十年编程经验输给新晋AI工程师,6个月我们带你绝地反击
  5. mfc 饼图绘画_绘画技能干货 | 【人体头颈】的绘画技巧(三)(内含母亲节抽奖公布)...
  6. HDU5875 - Function
  7. ntce服务器不稳定,当心!你的教师资格证成绩失效了!| 服务
  8. iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
  9. Java成神之路——ASM,Javassist,cglib区别。
  10. WCF分布式开发常见错误(17):无法启动MSMQ服务
  11. 14. YAML(1)
  12. 基于SpringCloud Alibaba实现的论坛
  13. 凸优化第三章凸函数 3.4拟凸函数
  14. cad导出pdf_关于PDF文件修改、生成、导图片用这一个软件就够了
  15. 免费地图大战?阿里上将高德百度元帅百度地图
  16. 单体架构常用注解合集
  17. 计算机系统常见故障及处理,电脑常见故障以及解决方案都在这里!
  18. 服务器发送消息给客户端,服务器如何发送消息给客户端
  19. 基于python的数字图像处理--学习笔记(二)
  20. 第二周 Ubuntu的简单介绍与使用

热门文章

  1. cin输入字符串怎么结束_翻遍全网,只为让你记住这些输入输出函数
  2. asm冗余 oracle_oracle asm 磁盘管理什么场景该用什么样的冗余方式
  3. 结合泛函极值_泛函极值及变分法教程.doc
  4. matlab pdist函数官方详解
  5. python连接sqlite数据库的代码_【Python 连接SQLite数据库文件】
  6. django使用templates模板
  7. linux 命令之 kill
  8. Hibernate中HQL函数汇总及其说明
  9. EntityFramework用法探索(二)CodeFirst
  10. Windows日志及其保护