Proxy实现java动态代理
在java设计模式中代理模式的应用比较广泛, 比如我在编写一写web程序时在filter修改request或response时, 而request中并没有相应的set方法, 这样要做到修改就需要使用一个新的类来实现HttpServletRequest接口,将原始的request放入新的类中在新的类中对相应的方法调用原始的方法并由服务器传递给Servlet使得到的不是原始的request而是我做了手脚的request,这样就可以做到在调用处理后的request取值时从中就可以将原始的类的值做修改后再返回。
但是在HttpServletRequest中有很多方法实现起来也很麻烦这样我们就可以使用动态代理。
下面列出动态生成代理要用的类或接口。
公共接口:
代理类和处理程序都需要实现的接口, 使用动态代理定义代理类时不需要实现,可在程序运行时指定.
PublicInterface //自定义公共接口
package com.lw.proxy; public interface PublicInterface { public void defaultMethod();
}
处理程序:
处理程序是实现业务处理的类, 代理类通过调用处理程序的方法来完成相应的业务(如果处理程序有返回值则返回该值),从而在处理程序方法调用之前或之后做出更改.
处理程序需实现InvocationHandler接口, 和 PublicInterface (公共接口),
注意: invoke方法的实现
package com.lw.proxy; import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method; public class HandlerClass implements PublicInterface , InvocationHandler{ @Override
public void defaultMethod() {
// TODO Auto-generated method stub
System.out.println("处理程序方法处理业务");
} /**
* 实现此方法, 在调用这个方法时使用method参数在处理程序对象上调用.
*/
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable { return method.invoke(this, args);
} }
代理类:
代理类是现实一系列接口的实现类, 因为是动态的代理类所以在定义时不现实任何接口。
注意:必需要有一个接收实现Invocationhandler接口的构造方法.
package com.lw.proxy; import java.lang.reflect.InvocationHandler; public class ProxyClass { private InvocationHandler handler; public ProxyClass(InvocationHandler handler) {
super();
this.handler = handler;
} }
java.lang.reflect.Proxy 此类将生成动态代理类。
Proxy静态方法:
//指定代理类的类加载器, 和代理类需要实现的接口,该方法将返回实现所有指定接口的Class
public static Class<?> getProxyClass(ClassLoader loader, Class<?>... interfaces)
//使用这个方法, 将生成代理类的实例。
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) 主程序 :
package com.lw.proxy; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy; public class TestProxy { public static void main(String[] args) throws Exception { /**
* 生成动态代理的class
*
* 指定动态代理类的类加载器, 和需要实现的接口。
* 返回实现所有指定接口的class。
*/
Class<?> cl = Proxy.getProxyClass(ProxyClass.class.getClassLoader(), PublicInterface.class);
//取得接收InvocationHandler参数的构造方法.
Constructor<?> con = cl.getConstructor(InvocationHandler.class);
//使用con构建实例,这个实现将实现所有指定的接口
PublicInterface proxyClass = (PublicInterface) con.newInstance(new HandlerClass());
//调用代理方法
proxyClass.defaultMethod(); /**
* 构建动态代理类的第二种方法
*/
Class[] cls = new Class[]{PublicInterface.class};
ClassLoader loader = ProxyClass.class.getClassLoader();
InvocationHandler h = new HandlerClass();
proxyClass = (PublicInterface) Proxy.newProxyInstance(loader, cls, h ); //调用
proxyClass.defaultMethod(); }
}
以上就构建了一个动态代理程序, 以上程序运行如下图。
Proxy实现java动态代理的更多相关文章
- java 动态代理范例 InvocationHandler与Proxy
java 动态代理范例 InvocationHandler与Proxy,拦截与代理 java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxy ...
- java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码
java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...
- java 动态代理学习(Proxy,InvocationHandler)
前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...
- Java Proxy和CGLIB动态代理原理
动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...
- java动态代理基本原理及proxy源码分析一
本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...
- java动态代理——字段和方法字节码的基础结构及Proxy源码分析三
前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- java动态代理——jvm指令集基本概念和方法字节码结构的进一步探究及proxy源码分析四
前文地址 https://www.cnblogs.com/tera/p/13336627.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- java动态代理——代理方法的假设和验证及Proxy源码分析五
前文地址 https://www.cnblogs.com/tera/p/13419025.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...
- Java 动态代理机制详解
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...
随机推荐
- unity之局域网
Unity自5.1以后支持新版的网络系统Unet,Unet是什么,优缺点是什么,和以前的网络系统有什么区别,请自行去百度.本篇要实现的功能是创建网络游戏的Player主角,以及实现移动同步.本教程来源 ...
- [Python] Scrapy爬虫框架入门
说明: 本文主要学习Scrapy框架入门,介绍如何使用Scrapy框架爬取页面信息. 项目案例:爬取腾讯招聘页面 https://hr.tencent.com/position.php?&st ...
- POJ-3259 Wormholes (ballman_ford 判负环)
ballman_ford 是对单源点到任意点最短路的处理方法(可以含负权边). 对所有边进行n-1次循环,(n为点得个数),如果此时源点到这条边终点的距离 大于 源点到这条边起点的距离加上路得权值就进 ...
- CodeForces 507E Breaking Good 2维权重dij
Breaking Good 题解: 2维权重dij, 先距离最短, 后改变最小. 在这个题中, 如果要改变最小, 则让更多的可用边放进来. 然后可以用pre存下关键边. 代码: ...
- 牛客第五场多校 A gpa 分数规划(模板)
链接:https://www.nowcoder.com/acm/contest/143/A来源:牛客网 Kanade selected n courses in the university. The ...
- FreeSql (九)删除数据
删除是一个非常危险的操作,FreeSql对删除支持并不强大,仅支持了单表有条件的删除方法. 不想过多的介绍拉长删除数据的系列文章,删除数据的介绍仅此一篇. 若Where条件为空的时候执行方法,Free ...
- kafka 主题管理
对于 kafka 主题(topic)的管理(增删改查),使用最多的便是kafka自带的脚本. 创建主题 kafka提供了自带的 kafka-topics 脚本,用来帮助用户创建主题(topic). b ...
- Redis的实现(java)
日常操作 public static void main(String[] args) { Jedis jedis = ); //1.开启事务 Transaction transaction = je ...
- Kubernetes监控实践
一.Kubernetes介绍 Kubernetes(K8s)是一个开源平台,能够有效简化应用管理.应用部署和应用扩展环节的手动操作流程,让用户更加灵活地部署管理云端应用. 作为可扩展的容错平台,K8s ...
- valueForKey与valueForKeyPath 区别
1.删除数组中重复的数据 2.valueForKeyPath:可以深层次取到子属性,不管隐藏的多深 valueForKey:无法取到深层次子属性 但是也有其相似的地方: 比如:快速找到字典数组中ke ...