代理模式-动态代理

package pattern.proxy.dynamic;

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
/**
 * 代理模式:Proxy Pattern
 * Java对代理模式的支持:
 * java.lang.reflect.Proxy、java.lang.reflect.InvocationHandler.
 * @version 2009-6-27
 * @author Winty(wintys@gmail.com)
 */
public class DynamicProxyTest{
    public static void main(String[] args){
        Subject subject = new RealSubject();
        Subject proxy = (Subject)DynamicProxySubjectFactory.factory(subject);
        proxy.request();
    }
}

/**
 * 抽象主题角色
 */
abstract interface Subject{
    public void request();
}

/**
 * 真实主题角色
 */
class RealSubject implements Subject{
    @Override
    public void request(){
        System.out.println("do request.");
    }
}

class DynamicProxyHandler implements InvocationHandler{
    private Subject realSubject;

    public DynamicProxyHandler(Subject realSubject){
        this.realSubject = realSubject;
    }

    //proxy代表Proxy生成的代理对象实例$Proxy0
    @Override
    public Object invoke(Object proxy, Method method, Object[] args)
        throws Throwable{
        
        preRequest();
        Object result = method.invoke(realSubject , args);
        postRequest();

        return result;
    }

    private void preRequest(){
        System.out.println("do preRequest");
    }

    private void postRequest(){
        System.out.println("do postRequest");
    }
}

/**
 * 动态代理类工厂 : 由Poxy类动态生成一个代理类(如:$Proxy0)。
 */
class DynamicProxySubjectFactory{
    /**
     * @param subject 被代理的真实对象。Subject必须为接口,
     *  即subject的真实类型是实现了Subject接口的类。
     *  因为JDK的动态代理并不能随心所欲的代理所有的,
     *  Proxy.newProxyInstance()的第二个参数决定只能代理接口。
     *
     * @return 代理类实例
     */
    public static Object factory(Subject subject){
        Class<?> cls = subject.getClass();
        DynamicProxyHandler handler = new DynamicProxyHandler(subject);

        return Proxy.newProxyInstance(cls.getClassLoader(),
                                                        cls.getInterfaces(),
                                                        handler);
    }
}

时间: 2024-10-20 12:51:53

代理模式-动态代理的相关文章

Java动态代理学习2——静态代理和动态代理并对照spring的通知

  一.代理模式  代理模式是常用的java设计模式,特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务.  按照代理的创建时期,代理类可以分为两种: 静态代理:由程序员创建或特定工具自动生成源代码再对其编译.在程序运行前代理类的.class文件就已经存在了. 动态

关于java中的静态代理和动态代理的疑问

问题描述 本人java还未入门者,看到java的反射这一块,里面介绍java的静态代理和动态代理,看的一知半解,有点没想明白的是,动态代理相对于静态代理到底有哪些优势,使用反射机制生成动态代理类,能实现的功能,用静态代理类也可以实现.动态代理不需要写代理类,但是需要写InvocationHandler类,以我的观点看,使用动态代理反而使代码更加难以理解.还请各位大侠给以指点,不胜感激! 解决方案 说一下我对这个问题的看法吧.代理应用的情况有以下几种: 访问控制 远程访问 加载开销比较大的资源(加

静态代理与动态代理

           记得刚接触代理,是在大话设计模式,最近在技术总结和学些java的过程又接触到静态代理和动态代理,尤其是动态代理,在学习AOP时,用到了动态代理,下面我用一些例子来对静态代理和动态代理做个总结.          其实用了代理之后最大的好处就是隐藏了真实类(委托类),这样更加安全,而静态代理和动态代理最大的区别就是,静态代理的代理类是程序员自己写的,在程序运行之前就已经存在的,而动态代理则是在程序运行时动态生成的,而且因为动态代理更加灵活,也常被应用.           首

深入解析java中的静态代理与动态代理_java

java编码中经常用到代理,代理分为静态代理和动态代理.其中动态代理可以实现spring中的aop. 一.静态代理:程序运行之前,程序员就要编写proxy,然后进行编译,即在程序运行之前,代理类的字节码文件就已经生成了 被代理类的公共父类 复制代码 代码如下: package staticproxy;public abstract class BaseClass {    public abstract void add();} 被代理类 复制代码 代码如下: package staticpro

简单静态代理与动态代理

静态: 首先需要一个接口 public interface Neting {  public void netting();    public String playGame(String name); } 然后需要一个实例去继承: public class NetImpl implements Neting {  @Override  public void netting() {   System.out.println("上网中....");  }  @Override  pu

【动态代理】动态代理Proxy_04

我们继续上一篇总结. 上篇我们说到,怎么让before()和after()中的内容也让客户灵活指定? 不管怎么样,我们现在需要一个这样的东西:可以动态指定对方法进行处理的指令. 我们创建一个方法调用的处理器,用来对任意方法进行自定义的处理: package cn.edu.hpu.proxy; import java.lang.reflect.Method; //方法调用的处理器 public interface InvocationHandler { //你只要给我一个Method方法,我就能对

静态代理与动态代理二

               动态代理的实现是基于java的三种API的,下面先来介绍一下:            1.java.lang.reflect.Proxy             这是 Java 动态代理机制生成的所有动态代理类的父类,它提供了一组静态方法来为一组接口动态地生成代理类及其对象.           <span style="font-size:14px;">// 方法 1: 该方法用于获取指定代理对象所关联的调用处理器 static Invoca

java代理 jdk动态代理应用案列_java

java代理有jdk动态代理.cglib代理,这里只说下jdk动态代理,jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 原理是(歌手.经纪人做例子): 建立一个公共的接口,比如:歌手public interface Singer: 用具体的类实现接口,比如:周杰伦,他是歌手所以实现Singer这个类,class MySinger implements Singer 建立代理类,这里也就是经纪人,他需要实现InvocationHandler类,并重写invok

java代理模式与动态代理模式详解_java

1.代理模式 所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之前起到中介的作用.代理模式给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用. 生活中的例子:过年加班比较忙,没空去买火车票,这时可以打个电话到附近的票务中心,叫他们帮你买张回家的火车票,当然这会附加额外的劳务费.但要清楚票务中心自己并不卖票,只有火车站才真正卖票,票务中心卖给你的票其实是通过火车站实现的.这点很重要!