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来满足的 ...
随机推荐
- Java IO体系综述
Java IO体系综述 一.流的概念 在Java API中,可以从其中读入一个字节序列的对象称作输入流,而可以向其中写入一个字节序列的对象称作输出流.这些字节序列的来源地和目的地可以是文件,而且通常都 ...
- MSIL实用指南-加载int值
这一篇讲的是怎样加载整数值到运算栈上.这一类的指令都是以Ldc_I4开头. Ldc_I4类OpCodes的Ldc_I4字段的功能是把一个int值压入运算栈上.它的使用方法是ilGenerator.Em ...
- 使用docker快速搭建Permeate渗透测试系统实践
一.背景 笔者最近在做一场Web安全培训,其中需要搭建一套安全测试环境:在挑选渗透测试系统的时候发现permeate渗透测试系统比较满足需求,便选择了此系统:为了简化这个步骤,笔者将系统直接封装到了d ...
- sql查询技巧指南
传送门(牛客网我做过的每到题目答案以及解析) sql定义: 结构化查询语言(Structured Query Language)简称SQL,是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用 ...
- 2019NC#8
题号 标题 已通过代码 题解/讨论 通过率 团队的状态 A All-one Matrices 点击查看 单调栈+前缀和 326/2017 通过 B Beauty Values 点击查看 进入讨论 8 ...
- 牛客国庆集训派对Day3 B Tree(树形dp + 组合计数)
传送门:https://www.nowcoder.com/acm/contest/203/B 思路及参考:https://blog.csdn.net/u013534123/article/detail ...
- HDU 4565 So Easy! 广义斐波拉数 数论 (a+sqrt(b))^n%mod 模板
So Easy! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- 牛客网暑期ACM多校训练营(第三场) A PACM Team 01背包 记录路径
链接:https://www.nowcoder.com/acm/contest/141/A来源:牛客网 Eddy was a contestant participating in ACM ICPC ...
- 《Fluent Python》---一个关于memoryview例子的理解过程
近日,在阅读<Fluent Python>的第2.9.2节时,有一个关于内存视图的例子,当时看的一知半解,后来查了一些资料,现在总结一下,以备后续查询: 示例复述 添加了一些额外的代码,便 ...
- java课堂测试样卷-----简易学籍管理系统
程序设计思路:分别建立两个类:ScoreInformation类(用来定义学生的基本信息以及设置set和get函数)ScoreManagement类(用来定义实现学生考试成绩录入,考试成绩修改,绩点计 ...