java学习之动态代理模式

 1 package com.gh.dynaproxy;
 2
 3 import java.lang.reflect.InvocationHandler;
 4 import java.lang.reflect.Method;
 5 /**
 6  * 动态代理类
 7  * @author ganhang
 8  *
 9  */
10 public class DynaProxy implements InvocationHandler{
11     private Object ob;//被代理对象
12     public DynaProxy(Object ob){
13         this.ob=ob;
14     }
15     private void before(){
16         System.out.println("为代理对象找对象中。。");
17     }
18     private void after(){
19         System.out.println("相亲完成。。");
20     }
21
22     @Override
23     public Object invoke(Object proxy, Method method, Object[] args)
24             throws Throwable {
25         Object obj=null;
26         before();
27         obj=method.invoke(ob, args);//真正调用业务方法
28         after();
29         return obj;
30     }
31 }
 1 package com.gh.dynaproxy;
 2 /**
 3  * 被代理类
 4  * @author ganhang
 5  *
 6  */
 7 public class Person implements Subject{
 8     private String name;
 9     public Person(String name){
10         this.name=name;
11     }
12     @Override
13     public void miai() {
14         System.out.println(name+"正在相亲中...");
15     }
16
17 }
 1 package com.gh.dynaproxy;
 2 /**
 3  * 要代理的主题接口
 4  * @author ganhang
 5  *
 6  */
 7 public interface Subject {
 8
 9     public void miai();
10
11 }
 1 package com.gh.dynaproxy;
 2
 3 import java.lang.reflect.Proxy;
 4 /**
 5  * 动态代理
 6  * @author ganhang
 7  *
 8  */
 9 public class test {
10     public static void main(String[] args){
11         Person p=new Person("小白");
12         DynaProxy dp=new DynaProxy(p);
13         //Proxy 提供用于创建动态代理类和实例的静态方法,它还是由这些方法创建的所有动态代理类的超类
14         //newProxyInstance(定义代理类的类加载器,代理类要实现的接口列表,InvocationHandler接口)
15         //返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序。它由指定的类加载器定义,并实现指定的接口
16         Subject s=(Subject)Proxy.newProxyInstance(p.getClass().getClassLoader(), p.getClass().getInterfaces(),dp);
17         s.miai();
18     }
19 }
时间: 2024-07-30 10:10:43

java学习之动态代理模式的相关文章

Java学习笔记——动态代理

所谓动态,也就是说这个东西是可变的,或者说不是一生下来就有的.提到动态就不得不说静态,静态代理,个人觉得是指一个代理在程序中是事先写好的,不能变的,就像上一篇"Java学习笔记--RMI"中的远程代理,其中客户端服务对象就是一个远程服务对象的代理,这个代理可以使得客户在操作时感觉像在操作本地对象一样,远程对象对于客户是透明的.我们可以看出这里的远程代理,是在程序中事先写好的,而本节我们要讨论的远程代理,是由JVM根据反射机制,在程序运行时动态生成的.(以上是本人的理解,如果有不正确的地

Java设计模式—Proxy动态代理模式

代理:设计模式 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 图 1. 代理模式 为了保持行为的一致性,代理类和委托类通常会实现相同的接口,所以在访问者看来两者没有丝毫的区别.通过代理类这中间一层,能有效控制对委托类对象的直接访问,也可以很好地隐藏和保护委托类对象,同时也为实施不同控制策略预留了空间,从而在设计上获得了更大的灵活性.Java 动态代理机制以巧妙的方式近乎完

Java学习:动态代理的一点小理解

手动实现 之前的一篇讲IoC的博文提到了代理模式,事实上代理模式就是AOP实现的重要基石.但是上面的代码有一个显而易见的缺陷,也就是之前讲解反射内容时提到的:不具备动态性. 上面代码中的Server就像是反射理解博文中提到的工厂订单管理员一样,每增加一样菜系,就需要相应更新手上的菜单.类比反射特性,我们完全可以做到让服务员不需要手上拿着菜单来为顾客服务: // 服务员实现类 public class ServerImpl implements Server { // 采用组合的方式引入noodl

Java学习之动态代理

设计模式 设计模式(Design Pattern)是前辈们对代码开发经验的总结,是解决特定问题的一系列套路.它不是语法规定,而是一套用来提高代码可复用性.可维护性.可读性.稳健性以及安全性的解决方案. 总体来说设计模式分为三大类: 创建型模式,共五种:工厂方法模式.抽象工厂模式.单例模式.建造者模式.原型模式. 结构型模式,共七种:适配器模式.装饰器模式.代理模式.外观模式.桥接模式.组合模式.享元模式. 行为型模式,共十一种:策略模式.模板方法模式.观察者模式.迭代子模式.责任链模式.命令模式

java中的动态代理(二)

上一节我介绍了什么是静态代理.在静态代理中的代理对象是直接定义在代码中的,这样会导致代码不能复用并且工作量也会成倍的增加所以在日常的开发中我们更多使用的是动态代理模式.在动态代理中,代理类在是程序运行中动态生成的,在java中一般有两种方式来实现动态代理模式,它们分别是javaSDK动态代理和第三方类库cglib动态代理. 今天我介绍的是java SDK动态代理.首先我们先来看一下如何使用java SDK实现动态代理模式: public class JavaSDKProxyTest { stat

JAVA学习篇--静态代理VS动态代理

本篇博客的由来,之前我们学习大话设计,就了解了代理模式,但为什么还要说呢? 原因: 1,通过DRP这个项目,了解到了动态代理,认识到我们之前一直使用的都是静态代理,那么动态代理又有什么好处呢?它们二者的区别是什么呢? 2,通过学习动态代理了解到动态代理是一种符合AOP设计思想的技术,那么什么又是AOP? 下面是我对它们的理解! 代理Proxy: Proxy代理模式是一种结构型设计模式,主要解决的问题是:在直接访问对象时带来的问题 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对

java 动态代理模式

一.相关类及其方法:java.lang.reflect.Proxy,Proxy 提供用于创建动态代理类和实例的静态方法.newProxyInstance()返回一个指定接口的代理类实例,该接口可以将方法调用指派到指定的调用处理程序(详见api文档) java.lang.reflect.InvocationHandler,InvocationHandler 是代理实例的调用处理程序 实现的接口.invoke()在代理实例上处理方法调用并返回结果.在与方法关联的代理实例上调用方法时,将在调用处理程序

Java静态代理与动态代理模式的实现

前言:    在现实生活中,考虑以下的场景:小王打算要去租房,他相中了一个房子,准备去找房东洽谈相关事宜.但是房东他很忙,平时上班没时间,总没有时间见面,他也没办法.后来,房东想了一个办法,他找到了一个人代替自己和小王洽谈,房东本人不用出面,他只要把他的对房客的要求告诉他找的那个人,那个人和你商量就可以了,这样就可以完成租房这件事了.这种现实场景比比皆是,所呈现出来的其实就是代理模式的原型的一种.我们把焦点转向编程,你是否在编程中经常遇见这样一个问题,对于访问某个对象,我们希望给它的方法前加入一

Java 代理模式(二) Java中的动态代理

动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: 1.Interface InvocationHandler 该接口中仅定义了一个方法: Object invoke(Object proxy, Method method, Object[] args) 在实际使用时,第一个参数obj一般是指代理类,method是被代理的方法,如上例中的request(),args为该方法的参数数组(无参时设置为null). 这个抽象方法在代理类中动态实现. 2