在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. Leetcode之二分法专题-367. 有效的完全平方数(Valid Perfect Square)

    Leetcode之二分法专题-367. 有效的完全平方数(Valid Perfect Square) 给定一个正整数 num,编写一个函数,如果 num 是一个完全平方数,则返回 True,否则返回 ...

  2. 单页面应用的History路由模式express后端中间件配合

    这篇文章主要分享一下通过HTML5的history API的时候,使用NodeJS后端应该如何配置,来避免产生404的问题,这里是使用的express的框架,主要是通过connect-history- ...

  3. 微信小程序捕获async/await函数异常实践

    背景 我们的小程序项目的构建是与web项目保持一致的,完全使用webpack的生态来构建,没有使用小程序自带的构建功能,那么就需要我们配置代码转换的babel插件如Promise.Proxy等:另外, ...

  4. in和exists过程对比

    两者执行流程完全不一样. in的过程 select * from tableA a where a.id in (select b.a_id from tableB b); 1)首先子查询,查询B表中 ...

  5. acm未解之谜-洛谷P1109学生分组

    把每一组的学生个数调度到一个给定区间范围内: 看了一圈题解,大佬都对原因避而不答: #include <iostream> #include <algorithm> using ...

  6. codeforces 509 E. Pretty Song(前缀和+前缀和的前缀和)

    题目链接:http://codeforces.com/problemset/problem/509/E 题意:给你一个字符串,求字串中包括子串中I, E, A, O, U, Y.所占的概率和. 题解: ...

  7. 【Offer】[5] 【替换空格】

    题目描述 思路分析 Java代码 代码链接 题目描述 请实现一个函数,把字符串中的每个空格替换成"%20". 例如输入"We are happy.",则输出&q ...

  8. mariadb数据库galera下添加新的服务器节点

    昨天经过各种努力,终于完成了两台服务器集成的搭建,今天再新开一台服务器,在想如何加入呢?网上度娘了很久结果没搜到相关文章:哎,索性直接照着前两台服务配置,在第三台(新服务器)上配置完成后重启maria ...

  9. SSM框架——详细整合教程

    SSM框架——详细整合教程(Spring+SpringMVC+MyBatis) 1.基本概念   1.1.Spring Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Jav ...

  10. Servlet+jsp用户登录加上验证码

    最近公司有个项目被客户拿去进行漏洞扫描,发现用户登录太简单,容易被暴力破解.当然发现的问题很多,什么反射型XSS,存储型XSS,敏感信息泄露等等.但是我们今天不讲这么多,就说说如何修复暴力破解的问题. ...