- 浏览: 414962 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (158)
- SpringBoot (10)
- vue.js (4)
- 2017基础知识 (2)
- jquery (4)
- extjs (8)
- spring (13)
- Java基础 (24)
- ibatis (2)
- oracle (18)
- 服务器配置 (8)
- maven (7)
- web应用开发 (14)
- 数据库 (9)
- 第三方依赖 (3)
- 百味人生 (7)
- svn (1)
- 问题一堆 (2)
- 测试驱动开发 (1)
- webServices (2)
- 网络编程 (2)
- 其它 (4)
- hibernate (2)
- ec标签序号列 (1)
- javascript (1)
- ActiveMQ (2)
- linux (5)
- UI (1)
- 问题汇集 (1)
- redis (1)
最新评论
-
jackson200:
讲解的狠不错!谢谢!
spring注入原理 -
阳光泛滥的日子:
讲的很透彻,受教了 。
spring中注解的实现原理 -
liudechao9:
最近在研究这方面,很不错,但是多线程并发的时候可能会出问题,而 ...
spring中注解的实现原理 -
小帅1127:
厉害啊 我的哥
spring中注解的实现原理 -
phoenixpaul:
...
Oracle存储过程和程序包
一、静态代理
package com.yt.manager.proxy; /** * @Description: 要代理的接口 * @ClassName: Service * @Project: spring-aop * @Author: zxf * @Date: 2011-6-2 */ public interface Service { public void outPut(); public void putOut(); public void outPut1(String v); }
package com.yt.manager.proxy; /** * @Description: 要代理接口的实现类 * @ClassName: ServiceImpl * @Project: spring-aop * @Author: zxf * @Date: 2011-6-2 */ public class ServiceImpl implements Service { @Override public void outPut() { // TODO Auto-generated method stub System.out.println("to run outPut method.............."); } @Override public void putOut() { // TODO Auto-generated method stub System.out.println("to run putOut method.............."); } public void outPut1(String v) { System.out.println("参数内容:" + v); } }
package com.yt.manager.proxy; /** * @Description: 静态代理类 * @ClassName: ServiceManagerImplProxy * @Project: base-info * @Author: zxf * @Date: 2011-5-19 */ public class ServiceManagerImplProxy implements Service { private Service service; public ServiceManagerImplProxy(Service service) { this.service = service; } @Override public void outPut() { // 在调用方法前调用验证方法 this.checkSecurity(); this.service.outPut(); } @Override public void putOut() { // 在调用方法前调用验证方法 this.checkSecurity(); this.service.putOut(); } @Override public void outPut1(String v) { // 在调用方法前调用验证方法 this.checkSecurity(); this.service.outPut1(v); } public void checkSecurity() { System.out.println("------------代理前要做的处理-----------------------"); } }
package com.yt.manager.proxy; /** * 调用代理测试类 * * @Description: * @ClassName: TestProxy * @Project: base-info * @Author: zxf * @Date: 2011-5-19 */ public class TestProxy { public static void main(String[] args) { Service s = new ServiceImpl(); Service serviceImp = new ServiceManagerImplProxy(s); serviceImp.outPut(); } }
可以看出静态代理类有一个很不爽的缺点:当如果接口加一个方法(把上面所有的代码的注释给去掉),所有的实现类和代理类里都需要做个实现。这就增加了代码的复杂度。动态代理就可以避免这个缺点。
二、动态代理
动态代理与普通的代理相比较,最大的好处是接口中声明的所有方法都被转移到一个集中的方法中处理(invoke),这样,在接口方法数量比较多的时候,我们可以进行灵活处理,而不需要像静态代理那样每一个方法进行中转。
动态代理类只能代理接口,代理类都需要实现InvocationHandler类,实现invoke方法。该invoke方法就是调用被代理接口的所有方法时需要调用的,该invoke方法返回的值是被代理接口的一个实现类
1、java.lang.reflect.proxy
proxy提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类。
newProxyInstance()
返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序
java.lang.reflect.InvocationHandler,
InvocationHandler 是代理实例的调用处理程序 实现的接口。
invoke()
在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。
(详见api文档)
2、
(1)、要代理实现类的接口
package com.yt.manager.proxy; public interface Service { public void outPut(); public void putOut(); public void outPut1(String v); }
(2)、要代理的实现类
package com.yt.manager.proxy; public class ServiceImpl implements Service { @Override public void outPut() { // TODO Auto-generated method stub System.out.println("to run outPut method.............."); } @Override public void putOut() { // TODO Auto-generated method stub System.out.println("to run putOut method.............."); } public void outPut1(String v) { System.out.println("参数内容:" + v); } }
(3)、代理类
package com.yt.manager.proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; /** * Java中的动态代理(作用:日志处理,事物处理,一些过滤器,拦截器之类的处理等AOP。 ) * 1、我们要有一个接口和一个实现该接口的实现类,而这个实现类就是我们要代理的对象。 * 2、我们要写一个要在代理类的方法执行时,能够做额外工作的类,而该类必须实现InvocationHandler接口。为什么要实现接口呢? * 因为代理类的实例在调用实现类的方法的时候,不会真正调用实现类的方法,而是转到这个类的invoke方法,在这个方法中我们进行 * 处理调用默认方法前的处理。 * 3、在要用代理类的实例去调用实现类的方法的时候,使用以下代码: * Service serviceImp = (Service) new SecurityHandler().newProxy(new ServiceImpl()); * serviceImp.outPut(); * * @author zxf * */ public class SecurityHandler implements InvocationHandler { private Object originalObject; // 将欲代理的对象传入,返回一个代理对象 public Object newProxy(Object obj) { this.originalObject = obj; // 三个参数,第一个是欲代理对象的类加载器,第二个是得到这个类的接口集合,第三个参数是一个handler return (Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj .getClass().getInterfaces(), this)); } /** * @param proxy 要代理的实现类 * @param method 要代理的实现类的方法 * @param args 要代理的实现类的方法的参数 */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { checkSecurity(); // 若方法名以out开头则调用下面逻辑 if (method.getName().startsWith("out")) { System.out.println("--------以拦截的方法!--------"); // 调用欲代理对象的相应方法 method.invoke(originalObject, args); } else { // 若不是需要拦截的方法则正常执行方法 method.invoke(originalObject, args); } return null; } public void checkSecurity() { System.out.println("--------在调用要代理类的方法前做的处理----------"); } }
(4)、测试类
package com.yt.manager.proxy; /** * 调用代理测试类 * @Description: * @ClassName: TestProxy * @Project: base-info * @Author: zxf * @Date: 2011-5-19 */ public class TestProxy { public static void main(String[] args) { Service serviceImp = (Service) new SecurityHandler().newProxy(new ServiceImpl()); serviceImp.outPut(); serviceImp.putOut(); serviceImp.outPut1("zhouxufeng"); } }
发表评论
-
采用DES加密解密实现接口的通信加密认证
2018-08-22 09:20 807DES全称Data Encryption Standard, ... -
log4j2 配置
2016-01-06 17:10 71661、log4j2官方下载地址h ... -
本文出一个简单读取JVM内存使用情况的例子
2015-12-07 15:16 792<%@page contentType="t ... -
代替request.getRealPath()
2014-03-21 11:22 1019代替request.getRealPath(); ... -
session超时时间设置方法
2012-11-05 15:11 1140由于session值之前没有设置,以至于刚登录的 ... -
ant 使用
2012-06-25 11:41 1252build.xml <?xml version=&qu ... -
ant 使用
2012-06-25 11:39 2build.xml <?xml version=&qu ... -
java中的排序
2012-02-15 10:01 1027/** * 选择排序:首先第一趟从n个元素中找到最大或最小 ... -
封装类比较出现的问题
2011-10-09 10:24 1190Java为了性能提供了一个类似缓存的东西,不仅仅 ... -
java多线程三:线程同步
2011-07-20 11:21 1593多线程编程是很有趣的事情,它常常容易出现"错误 ... -
java多线程二:控制线程方法
2011-07-20 10:25 1012join线程: 1、Thread线程提供了让一个线程等待另外 ... -
java多线程一:概念与原理
2011-07-19 16:13 11651、线程是什么? ... -
java多线程
2011-07-19 15:06 31、线程是什么? 几乎所有的操作系统都支持 ... -
java多线程
2011-07-19 15:05 21、线程是什么? 几乎所有的操作系统都支持同事运 ... -
java多线程
2011-07-19 15:05 11、线程是什么? 几乎所有的操作系统都支持同事运行多 ... -
java多线程
2011-07-19 14:56 3http://lavasoft.blog.51cto.com/ ... -
java中的IO操作
2011-07-13 14:54 11211、 Java 的 IO 支持通过 ja ... -
多线程下载文件
2011-07-13 14:11 5226网络蚂蚁、FlashGet、迅 ... -
Java垃圾回收机制
2011-07-06 16:55 14971、当程序创建对象时, ... -
java反射机制
2011-06-02 14:06 1024一、定义: 1、在Java运行时环境中,对于任意 ...
相关推荐
Java代理模式是一种设计模式,它在面向对象编程中扮演着重要的角色,主要目的是为了在不修改原有对象的基础上,为对象添加额外的功能或者控制对对象的访问。代理模式的核心思想是通过代理类来间接调用目标类的方法,...
### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...
总结一下,Java代理模式的核心在于`Proxy`类和`InvocationHandler`接口,它们共同实现了在运行时动态创建符合特定接口的代理对象。通过代理,我们可以在不修改原始对象代码的情况下,添加额外的功能或者控制对原始...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理对象,该代理对象在调用实际对象的方法之前或之后可以执行额外的操作。这在不修改原有对象代码的情况下,提供了扩展功能的可能性。代理模式通常分为两...
Java代理模式是一种设计模式,它允许我们为现有的对象创建一个代理对象,以便在不修改原对象的情况下增强或扩展其功能。这种模式在处理需要添加额外逻辑但又不想修改原始类的场景时尤其有用,比如日志、事务管理、...
### Java代理模式和动态代理详解 #### 一、概述 在软件工程中,代理模式是一种常用的软件设计模式,主要用于在不直接暴露目标对象的情况下提供一个替代接口。这种模式可以简化客户端与目标对象之间的交互,同时还...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在不影响原始对象功能的基础上,增强或扩展其行为。代理模式在软件开发中广泛应用,例如用于权限控制、事务管理、日志记录等场景。...
在给定的“java代理模式示例源码”中,我们可以通过房产中介的例子来理解这种模式。 房产中介在现实生活中,是客户与房东之间的桥梁,它可以代表客户处理租赁事宜,也可以在房东和客户之间传递信息,这与代理模式的...
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在调用原始对象的方法之前或之后执行额外的操作。代理模式在软件工程中有多种应用,例如:增加安全控制、性能监控、事务管理等。...
Java代理模式 事例很生动,非常容易理解,推荐给大家。
Java代理模式是一种设计模式,它允许我们为一个对象创建一个代理,这个代理对象可以在调用原始对象的方法之前或之后执行额外的操作。代理模式在很多场景下都非常有用,比如在访问对象时增加安全性、性能监控、事务...
在本实例中,我们将深入探讨Java中的代理模式及其应用。 代理模式的核心思想是为一个对象创建一个代理对象,这个代理对象在客户端和目标对象之间起到中介的作用。它可以控制目标对象的访问,也可以在调用目标对象的...
用java实现代理模式,使用房屋中介的现实例子进行代理模式的说明
Java代理模式.pdf