Java 动态代理原理
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 动态代理原理相关推荐
- Java 动态代理原理图解 (附:2种实现方式详细对比)
动态代理在 Java 中有着广泛的应用,例如:Spring AOP 面向切面编程,Hibernate 数据查询.以及 RPC Dubbo 远程调用等,都有非常多的实际应用@mikechen 目录 Ja ...
- java动态代理原理及解析
转载自 http://blog.csdn.net/scplove/article/details/52451899 代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制 ...
- java动态代理原理
代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过 ...
- java动态代理原理解析
总结:一.应用:1.要代理的类必须有对应实现接口.2.被增强的代码要实现invocationHandle接口,实现接口的invoke方法,在方法里添加增强代码和通过调用method.invoke( p ...
- Java动态代理原理分析
JDK动态代理原理分析 interface Foo {void foo(); }class Target implements Foo {@Overridepublic void foo() {Sys ...
- java动态代理原理剖析
首先来谈为什么需要代理. 比如我有一个接口如下 public interface Moveable {void move();} 它有一个move方法.现在我有这样一个需求,当我要通过子类实现该接口调 ...
- Java 动态代理 原理解析
概要 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常 ...
- 【Java基础知识 14】java动态代理原理
- 深入理解Java Proxy和CGLIB动态代理原理
点击上方关注,每天进步一点点 动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译 ...
最新文章
- ceph 部署单机集群
- content 内容生成技术2
- 10锁屏幻灯片_手机跟我学第一百八十八课——如何设置锁屏
- 十年编程经验输给新晋AI工程师,6个月我们带你绝地反击
- mfc 饼图绘画_绘画技能干货 | 【人体头颈】的绘画技巧(三)(内含母亲节抽奖公布)...
- HDU5875 - Function
- ntce服务器不稳定,当心!你的教师资格证成绩失效了!| 服务
- iKcamp团队制作|基于Koa2搭建Node.js实战(含视频)☞ 中间件用法
- Java成神之路——ASM,Javassist,cglib区别。
- WCF分布式开发常见错误(17):无法启动MSMQ服务
- 14. YAML(1)
- 基于SpringCloud Alibaba实现的论坛
- 凸优化第三章凸函数 3.4拟凸函数
- cad导出pdf_关于PDF文件修改、生成、导图片用这一个软件就够了
- 免费地图大战?阿里上将高德百度元帅百度地图
- 单体架构常用注解合集
- 计算机系统常见故障及处理,电脑常见故障以及解决方案都在这里!
- 服务器发送消息给客户端,服务器如何发送消息给客户端
- 基于python的数字图像处理--学习笔记(二)
- 第二周 Ubuntu的简单介绍与使用