在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动态代理的更多相关文章

  1. java 动态代理范例 InvocationHandler与Proxy

    java 动态代理范例 InvocationHandler与Proxy,拦截与代理 java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxy ...

  2. java 动态代理深度学习(Proxy,InvocationHandler),含$Proxy0源码

    java 动态代理深度学习, 一.相关类及其方法: java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定 ...

  3. java 动态代理学习(Proxy,InvocationHandler)

    前几天看到java的动态代理机制,不知道是啥玩意,然后看了看.死活不知道 invoke(Object proxy, Method m, Object[] args)种的proxy是个什么东西,放在这里 ...

  4. Java Proxy和CGLIB动态代理原理

    动态代理在Java中有着广泛的应用,比如Spring AOP,Hibernate数据查询.测试框架的后端mock.RPC,Java注解对象获取等.静态代理的代理关系在编译时就确定了,而动态代理的代理关 ...

  5. java动态代理基本原理及proxy源码分析一

    本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的态度,于是对java动态代理的本质原理做了一些研究,于是便有了这个系列的文章 为了尽快进入正题,这里 ...

  6. java动态代理——字段和方法字节码的基础结构及Proxy源码分析三

    前文地址:https://www.cnblogs.com/tera/p/13280547.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

  7. java动态代理——jvm指令集基本概念和方法字节码结构的进一步探究及proxy源码分析四

    前文地址 https://www.cnblogs.com/tera/p/13336627.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

  8. java动态代理——代理方法的假设和验证及Proxy源码分析五

    前文地址 https://www.cnblogs.com/tera/p/13419025.html 本系列文章主要是博主在学习spring aop的过程中了解到其使用了java动态代理,本着究根问底的 ...

  9. Java 动态代理机制详解

    在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...

随机推荐

  1. Mybatis基于注解实现多表查询

    对应的四种数据库表关系中存在四种关系:一对多,多对应,一对一,多对多.在前文中已经实现了xml配置方式实现表关系的查询,本文记录一下Mybatis怎么通过注解实现多表的查询,算是一个知识的补充. 同样 ...

  2. dotnet core各rpc组件的性能测试

    一般rpc通讯组件都具有高性特性,因为大部分rpc都是基于二进制和连接复用的特点,相对于HTTP(2.0以下的版本)来说有着很大的性能优势,非常适合服务间通讯交互.本文针对了dotnet core平台 ...

  3. GO.数据库接口

    Go没有内置的驱动支持任何的数据库,但是Go定义了database/sql接口,用户可以基于驱动接口开发相应数据库的驱动. 目前NOSQL已经成为Web开发的一个潮流,很多应用采用了NOSQL作为数据 ...

  4. CF1097D Makoto and a Blackboard 质因数分解 DP

    Hello 2019 D 题意: 给定一个n,每次随机把n换成它的因数,问经过k次操作,最终的结果的期望. 思路: 一个数可以表示为质数的幂次的积.所以对于这个数,我们可以分别讨论他的质因子的情况. ...

  5. 【Offer】[20] 【表示数值的字符串】

    题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2" ...

  6. 【LeetCode】435-无重叠区间

    题目描述 给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠. 注意: 可以认为区间的终点总是大于它的起点. 区间 [1,2] 和 [2,3] 的边界相互"接触", ...

  7. 【LeetCode】162-寻找峰值

    题目描述 峰值元素是指其值大于左右相邻值的元素. 给定一个输入数组 nums,其中 nums[i] ≠ nums[i+1],找到峰值元素并返回其索引. 数组可能包含多个峰值,在这种情况下,返回任何一个 ...

  8. TypeScript + React + Redux 实战简单天气APP全套完整项目

    下载链接:https://www.yinxiangit.com/171.html 目录: 从面向过程的js到面向对象的js,让web前端更加高大尚.让你的前端步步日上,紧跟技术发展的前沿.让你构建更加 ...

  9. .Net基础篇_学习笔记_第五天_流程控制while循环

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  10. NTP服务器实现

    时间服务器是一种计算机网络仪器,它从参考时钟获取实际时间,再利用计算机网络把时间信息传递给用户.虽然还有一些比较少用或过时的协议仍然在使用,但现时最重要及广泛使用,作为时间信息发送和同步化的协议是网络 ...