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来满足的 ...
随机推荐
- 快速傅立叶变换FFT模板
递归版 UOJ34多项式乘法 //容易暴栈,但是很好理解 #include <cmath> #include <iostream> #include <cstdio> ...
- CodeForces 778B - Bitwise Formula
题意: 选择一个 m 位的二进制数字,总分为 n 个算式的答案之和.问得到最低分和最高分分别应该取哪个二进制数字 分析: 因为所有数字都是m位的,高位的权重大于低位 ,我们就从高到低考虑 ans 的每 ...
- Qbxt 模拟题 day3(am) T3 选数字 (select)(贪心)
选数字 (select Time Limit:3000ms Memory Limit:64MB 题目描述 LYK 找到了一个 n*m 的矩阵,这个矩阵上都填有一些数字,对于第 i 行第 j 列的位置上 ...
- java输出txt文件到桌面
private static void outputTxt(String ExportFailStudentMsg){ FileSystemView fsv = FileSystemView.getF ...
- HTML5属性备忘单
在网上闲逛的时候看到了文章,感觉总结的这个html5文章,决定转载过来,在排版的时候也帮助自己重新梳理复习一遍.毕竟学习基础最重要. by zhangxinxu from http://www.zha ...
- AcWing:109. 天才ACM(倍增 + 归并排序)
给定一个整数 MM,对于任意一个整数集合 SS,定义“校验值”如下: 从集合 SS 中取出 MM 对数(即 2∗M2∗M 个数,不能重复使用集合中的数,如果 SS 中的整数不够 MM 对,则取到不能取 ...
- (转载)深入理解Java:内省(Introspector)
本文转载自:https://www.cnblogs.com/peida/archive/2013/06/03/3090842.html 一些概念: 内省(Introspector) 是Java 语言对 ...
- JS基础_原型对象
原型prototype 我们创建的每一个函数,解析器都会向函数中添加一个属性prototype 这个属性,对应着一个对象,这个对象就是我们所谓的原型对象 1.如果函数作为普通函数调用prototype ...
- Thymeleaf Multiple Template Locations using Spring Boot
1. Overview In this tutorial, we'll see how we can define multiple template locations using Thymelea ...
- Anaconda官网下载太慢/出错,以及Anaconda下载包又慢又出错的总体方法,应该如何快速下载,使用上海科技大学的开源镜像站即可
1.最新更新:清华源和中科大源都已经挂了,不要再用他们的镜像源了!!!用上海科技大学的镜像!!!! 2.其次,CSDN上大多的快速装包法都在现在(2019.5.11)出现了问题,也不全,本文是亲自实践 ...