java Proxy InvocationHandler 动态代理实现详解
spring 两大思想,其一是IOC,其二就是AOP..而AOP的原理就是java 的动态代理机制。这里主要记录java 动态代理的实现及相关类的说明。
java 动态代理机制依赖于InvocationHandler接口、Proxy类。这是java 实现动态代理必须用到的。
一、InvocationHandler:该接口中只有一个方法 public Object invoke(Object proxy, Method method, Object[] args)throws Throwable;
该方法的作用目标对象的方法会转发由InvocationHandle这个接口的invoke方法来调用
/**
* invoke 是 InvocationHandler 接口的唯一方法
* 当我们使用动态代理调用目标对象的方法时,
* 目标对象的方法会转发由InvocationHandle这个接口的invoke方法来调用
* 参数 1、proxy ==> 代理的目标对象
* 2、method ==> 目标对象要调用的方法
* 3、args ==> 目标对象要调用的方法的参数数据
*
*/
以下是源码对invoke方法的解释
/**
* Processes a method invocation on a proxy instance and returns
* the result. This method will be invoked on an invocation handler
* when a method is invoked on a proxy instance that it is
* associated with.
*/
二、Proxy:Proxy类的作用及时动态创建一个代理对象的类,Proxy提供了许多方式,用了最多的是newProxyInstance
/**
*
* @param target
* @return
*
* Proxy.newProxyInstance(loader, interfaces, h) 说明:
* Proxy类的作用及时动态创建一个代理对象的类,Proxy提供了许多方式,用了最多的是newProxyInstance
* 参数 1、loader ==> 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
* 2、interfaces ==> 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,
* 如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
* 3、h ==> 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,
* 会关联到哪一个InvocationHandler对象上
*
*
*/
以下是源码的解释
/**
* Returns an instance of a proxy class for the specified interfaces
* that dispatches method invocations to the specified invocation
* handler.
*/
三、动态代理的实现
1、创建布标对象的接口Hello.java
/**
* java proxy InvocationHandler 动态代理公共接口
*
* @author dyf
*
*/
public interface Hello {
void sayHello();
void run(String name,int count);
}
2、创建代理类DynaProxy.java
package cn.dyf.proxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy; /**
* java proxy InvocationHandler 实现公共接口代理对象
* 动待代理对象需实现InvocationHandler接口,重新invoke方法
* @author dyf
*
*/
public class DynaProxy implements InvocationHandler{ private Object target; /**
*
* @param target
* @return
*
* Proxy.newProxyInstance(loader, interfaces, h) 说明:
* Proxy类的作用及时动态创建一个代理对象的类,Proxy提供了许多方式,用了最多的是newProxyInstance
* 参数 1、loader ==> 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
* 2、interfaces ==> 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,
* 如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
* 3、h ==> 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,
* 会关联到哪一个InvocationHandler对象上
*
*
*/
public Object bind(Object target) {
this.target = target;
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(),
this.target.getClass().getInterfaces(), this); } /**
* invoke 是 InvocationHandler 接口的唯一方法
* 当我们使用动态代理调用目标对象的方法时,目标对象的方法会转发由InvocationHandle这个接口的invoke方法来调用
* 参数 1、proxy ==> 代理的目标对象
* 2、method ==> 目标对象要调用的方法
* 3、args ==> 目标对象要调用的方法的参数数据
*
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
result = method.invoke(this.target, args);
return result;
} }
3、创建App测试类
package cn.dyf.proxy;
public class ProxyApp {
public static void main(String[] args) {
// new StaticProxy(new SjHello()).sayHello();
Hello bind = (Hello)new DynaProxy().bind(new SjHello());
bind.sayHello();
bind.run("小明", 100);
}
}
java Proxy InvocationHandler 动态代理实现详解的更多相关文章
- 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来满足的 ...
- java的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- Java的动态代理机制详解(转)
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- [转载] java的动态代理机制详解
转载自http://www.cnblogs.com/xiaoluo501395377/p/3383130.html 代理模式 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代 ...
- ava的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
- InvocationHandler和Proxy(Class)的动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
随机推荐
- Acwing-204-表达整数的奇怪方式(扩展中国剩余定理)
链接: https://www.acwing.com/problem/content/206/ 题意: 给定2n个整数a1,a2,-,an和m1,m2,-,mn,求一个最小的非负整数x,满足∀i∈[1 ...
- Spring前置方法无法阻止原方法执行(转)
在前置方法用return的方法无法阻止原方法的执行. 该处的return 只是结束了目标方法执行前的检验方法而已,而不是结束目标方法. 使用抛异常的方式程序终止. 环绕通知可以阻止原方法的执行, pu ...
- NServiceBus:使用自定义log4net
安装扩展包:NServiceBus.Log4Net Endpoint.cs增加注入 log4net.Config.BasicConfigurator.Configure(); NServiceBus. ...
- CentOS7 升级Openssl的办法
1.查看安装的版本 openssl version -a OpenSSL 1.0.2 2.下载 openssl-1.1.1.tar.gz,目前最新是1.1.1,可以通过修改版本号的方式下载最新版本 最 ...
- AcWing:173. 矩阵距离(bfs)
给定一个N行M列的01矩阵A,A[i][j] 与 A[k][l] 之间的曼哈顿距离定义为: dist(A[i][j],A[k][l])=|i−k|+|j−l|dist(A[i][j],A[k][l]) ...
- 20.Python类型转换,Python数据类型转换函数大全
虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型转换. 比如说,我们想通过使用 print() 函数输出信 ...
- git commit -m "XX"报错 pre -commit hook failed (add --no-verify to bypass)问题
在同步本地文件到线上仓库的时候 报错 pre -commit hook failed (add --no-verify to bypass) 当你在终端输入git commit -m "xx ...
- Speed
传送门:Speed 题目大意 给一棵n个点的无根树,每条树边i给出li和ri表示速度在[li,ri]内才能通过这条边. 现在有m个询问,每个询问给出一个速度x,求以x的速度(不能改变)能在树上通过的路 ...
- [CSP-S模拟测试]:Weed(线段树)
题目描述 $duyege$的电脑上面已经长草了,经过辨认上面有金坷垃的痕迹.为了查出真相,$duyege$准备修好电脑之后再进行一次金坷垃的模拟实验.电脑上面有若干层金坷垃,每次只能在上面撒上一层高度 ...
- 邻居子系统 之 邻居表的初始化neigh_table_init
概述 邻居子系统支持多种实现,例如ARP,ND等,这些实现需要在其初始化的时候,调用neigh_table_init将邻居表项添加到全局邻居子系统数组中,并对实例中的字段(如hash,定时器等)进行相 ...