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来满足的 ...
随机推荐
- springboot2.x下actuator模块
一.简介 spring-boot-starter-actuator模块是一个spring提供的监控模块.我们在开运行发过程中,需要实时和定时监控服务的各项状态和可用性.Spring Boot的s ...
- bootstrap与IE、360浏览器的兼容问题
bootstrap样式在IE.360浏览器无法正常显示,之前使用的一个基于bootstrap的插件在IE.360浏览器也无法正常使用. bootstrap3支持的浏览器有: Chrome (Mac.W ...
- 【Python之路】特别篇--Python切片
字符串切片操作 切片操作符是序列名后跟一个方括号,方括号中有一对可选的数字,并用冒号分割. 注意: 数是可选的,而冒号是必须的. consequence[start:end:step] 切片操作符中的 ...
- HTML5上传超大文件解决方案
一.概述 所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载.在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了.一般断点下载时才用到Range和Content- ...
- Codevs 4829 [DP]数字三角形升级版
4829 [DP]数字三角形升级版 时间限制: 1 s 空间限制: 16000 KB 题目等级 : 黄金 Gold 题目描述 Description 从数字三角形的顶部(如图,第一行的5表示行数)到底 ...
- android 开发随手记
1.Fragment 跳转到Activity 修改数据,修改完后从Activity 返回(返回键)Fragment ,要求刷新Fragment界面的数据 解决办法: 在Fragment中注册一个监听广 ...
- JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上
JavaWeb-RESTful(一)_RESTful初认识 传送门 JavaWeb-RESTful(二)_使用SpringMVC开发RESTful_上 传送门 JavaWeb-RESTful(三)_使 ...
- Android_(控件)使用自定义控件在屏幕中绘制一条虚线
在Android屏幕中绘制虚线,最通用的是自定义控件DashedLine,再将自定义控件放入xml布局中 运行截图: 程序结构 package com.example.asus.gary_042; i ...
- 解决Maven打包提示:读取C:\Users\Administrator\.m2\repository\ch\qos\logback\logback-classic\1.2.3\logback-classic-1.2.3.jar时出错; invalid LOC header (bad signature)
1.打包情况 虽然提示读取jar包出错,但是还是能打包成功,在执行打的jar包时会报错,说找不到相关的类. 2.解决方案 从提示的路径可以找到对应的jar包,但为什么会读取错误呢?尝试着双击打开log ...
- 12.数值的整数次方 Java
题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方. 这道题看似简单,其实BUG重重.要注意的问题: 1 关于次幂的问题特殊的情况, ...