`

代理模式之动态代理

阅读更多

     为什么叫动态代理呢?动态代理就是实现阶段不用关心代理谁,而是在运行阶段指定代理哪一个对象,相对来说自己写代理类的方式都是静态代理,现在有一个非常流行的框架Spring,当我们面试的时候一般都会问Spring有哪些特征,我们一般会说AOP、IOC,其实这里的AOP即面向横切面变成的实现原理就是动态代理。

 

接着上次小明找游戏代理说,看看使用动态代理如何实现小明找代练的场景:




 
与自己写代理类的不同之处是我们并没有写代理类并且多了一个接口InvocationHandler,这个接口的作用就是为我们在运行时产生一个指定的代理对象并且这个接口使用JDK提供的。

 

代码如下:

 

 

public interface IGamePlayer {

    // 登陆
    public void login(String user, String pwd);

    // 打怪
    public void daguai();

    // 升级
    public void upgrade();
}

 

 

 

public class Xiaoming implements IGamePlayer {

    private String name;

    public Xiaoming(String name) {

        this.name = name;
    }

    /**
     * @param user
     * @param pwd
     */
    @Override
    public void login(String user, String pwd) {

        System.out.println("登陆名为:" + user + "的用户:" + this.name + "登陆成功");
    }

    /**
     * 
     */
    @Override
    public void daguai() {

        System.out.println(this.name + "在打怪");
    }

    /**
     * 
     */
    @Override
    public void upgrade() {

        System.out.println(this.name + "游戏升级了");
    }

}

 

public class GamePlayerHandler implements InvocationHandler {

    // 被代理类
    private Class cls;

    // 被代理者实例
    private Object object;

    public GamePlayerHandler(Object object) {

        this.object = object;
    }

    /**
     * 调用被代理的方法
     * 
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method,
     *      java.lang.Object[])
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        // TODO Auto-generated method stub

        Object result = method.invoke(object, args);
        return result;
    }

}

 

public class Client {

    public static void main(String[] args) {

        // 小明玩家
        IGamePlayer player = new Xiaoming("小明");

        // 定义一个handler
        InvocationHandler handler = new GamePlayerHandler(player);

        // 获得Class loader
        ClassLoader loader = player.getClass().getClassLoader();

        // 动态产生一个代理
        IGamePlayer proxy = (IGamePlayer) Proxy.newProxyInstance(loader,
                new Class[] { IGamePlayer.class }, handler);

        // 登陆
        proxy.login("小明", "1111");

        // 打怪
        proxy.daguai();

        // 升级
        proxy.upgrade();
    }
}

 

还记的代理的作用吗?我们使用代理的目的主要是为了实现类的功能增强,那么动态代理如何增强呢?先看看通的动态代理类图:

 



 

public interface Subject {

    public void doSomething();
}

 

public class RealSubject implements Subject {

    /**
     * 
     * @see com.huashao.chapter.chapter12_03.Subject#doSomething()
     */
    @Override
    public void doSomething() {

        System.out.println("do some thing");
    }

}

 

public class MyInvocationHandler implements InvocationHandler {

    // 被代理类的对象
    private Object target;

    public MyInvocationHandler(Object object) {

        this.target = object;
    }

    /**
     * @param proxy
     * @param method
     * @param args
     * @return
     * @throws Throwable
     * @see java.lang.reflect.InvocationHandler#invoke(java.lang.Object, java.lang.reflect.Method,
     *      java.lang.Object[])
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        Object result = method.invoke(target, args);
        return result;
    }

}

 

public class DynamicProxy<T> {

    public static <T> T newProxyInstance(ClassLoader loader, Class<?>[] interfaces,
                                         InvocationHandler handler) {

        // 寻找JoinPoint 连接点,执行一个前置通知
        if (true) {
            (new BeforeAdvice()).exec();
        }
        return (T) Proxy.newProxyInstance(loader, interfaces, handler);

    }
}

 

public interface IAdvice {

    public void exec();
}

 

public class BeforeAdvice implements IAdvice {

    /**
     * 
     * @see com.huashao.chapter.chapter12_03.IAdvice#exec()
     */
    @Override
    public void exec() {

        System.out.println("前置通知,执行");
    }

}

 

public class Client {

    public static void main(String[] args) {

        Subject subject = new RealSubject();

        InvocationHandler handler = new MyInvocationHandler(subject);

        Subject proxy = DynamicProxy.newProxyInstance(subject.getClass().getClassLoader(), subject
                .getClass().getInterfaces(), handler);

        proxy.doSomething();
    }
}

 

 

  • 大小: 37.7 KB
  • 大小: 36.3 KB
分享到:
评论

相关推荐

    用Java实现的代理模式之动态代理

    `代理模式之动态代理.ppt`则可能是一个PPT文档,提供了代理模式的理论介绍和代码示例。 4. **学习与实践** 要深入理解动态代理,你需要动手编写代码,尝试创建自己的`InvocationHandler`并使用`Proxy`来生成代理...

    java模式设计-代理模式之动态代理.ppt

    在Java中,动态代理是代理模式的一种实现方式,它允许我们在运行时创建代理对象,这种方式比静态代理更加灵活。动态代理在JDK 1.3及以后的版本中得到了支持,主要涉及到三个核心类:`Proxy`、`InvocationHandler`和`...

    [浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part2

    [浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part2

    [浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part1

    [浪曦原创]JAVA设计模式.第6讲.代理模式之动态代理(jzkangta).part1

    动态代理设计模式 日志和源码

    动态代理设计模式是一种在运行时创建代理对象的技术,它允许我们为现有的对象提供额外的功能,如日志记录、性能监控、事务管理等,而无需修改原对象的代码。这种模式在Java和许多其他编程语言中都有应用,尤其在...

    Java代理模式Java动态代理

    ### Java代理模式与Java动态代理详解 #### 一、代理模式概述 代理模式是一种软件设计模式,它在客户端和目标对象之间提供了一种间接层。这种模式的主要目的是控制客户端对目标对象的访问,并且可以在不修改原有...

    Java设计模式——代理设计模式(静态代理和动态代理)

    在Java编程中,设计模式是一种解决常见问题的模板或最佳实践,它可以帮助开发者编写更加灵活、可维护和可扩展的代码。代理设计模式是其中的一种,它的主要作用是在...在实际开发中,应根据项目需求选择合适的代理模式。

    Android设计模式之代理模式(Proxy Pattern)

    代理模式是设计模式的一种,它的主要目的是在不改变原有对象的基础上,为一个对象提供额外的功能或者控制对这个对象的访问。在Android开发中,代理模式的应用尤为常见,尤其在处理复杂的业务逻辑、网络请求、界面...

    java装饰模式及动态代理模式示例源码

    装饰模式和动态代理模式是Java编程中两种非常重要的设计模式,它们都在代码的扩展性和灵活性方面发挥着关键作用。下面将分别对这两种模式进行详细解释,并结合手写的数据库连接池和动态代理模式的使用进行深入探讨。...

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理)

    Java 动态代理详解(代理模式+静态代理+JDK动态代理+CGLIB动态代理) Java 动态代理是 Java 编程语言中的一种强大工具,广泛应用于 Spring AOP、Hibernate 数据查询、测试框架的后端 mock、RPC 远程调用、Java 注解...

    JAVA设计模式之代理模式实例

    代理模式主要分为静态代理和动态代理两种类型。 1. 静态代理 在静态代理中,代理类和目标类是在编译时就已经确定的,它们通常具有相同的接口。客户端通过代理类调用方法,代理类再转发到目标类。以下是一个简单的...

    java静态代理、动态代理、装饰设计模式

    在Java编程中,代理模式是一种常见的设计模式,它允许我们为一个对象提供一个代理以控制对这个对象的访问。代理模式通常用于增加额外的功能或在访问原对象时进行额外的操作,比如日志记录、安全控制、性能统计等。...

    设计模式之代理模式Proxy

    在Java中,代理模式可以通过静态代理和动态代理来实现。静态代理是在编译时就确定了代理关系,需要为每个真实对象创建一个对应的代理类。而动态代理(如Java的`java.lang.reflect.Proxy`类和`InvocationHandler`接口...

    代理模式的使用示例程序

    代理模式的实现通常有两种方式:静态代理和动态代理。静态代理是在编译时就确定了代理关系,需要为每个原始对象创建一个对应的代理类。动态代理则是在运行时动态创建代理对象,这通常通过Java的反射API或C#的`System...

    代理模式-静态动态代理-jdk动态代理-cglib动态代理

    在Java中,代理模式有多种实现方式,包括静态代理、JDK动态代理和CGLIB动态代理。 **静态代理** 静态代理是最早也是最基础的代理实现方式。在静态代理中,我们需要创建一个代理类,这个代理类与原始类(被代理类)...

    结构型模式之代理模式(Proxy)

    代理模式是一种设计模式,属于结构型模式之一,其主要目的是为其他对象提供一个代理,以控制对该对象的访问。在实际应用中,代理模式能够帮助我们实现如下的功能: 1. 远程代理:代理对象可以代表一个位于远程系统...

    动态代理设计模式

    详细而又简单的讲述了java动态代理设计模式

Global site tag (gtag.js) - Google Analytics