java-动态代理

在学习spring的AOP时候,动态代理那是必不可少的环节。

今天简单介绍一下动态代理。

java动态代理是一种设计模式中代理模式的一种,帮助我们开发的一个工具吧。

*1.动态代理的优势:*

  1. 降低各个功能模块之间的耦合度,提高开发的效率和方便程序的维护度。
  2. 和aop的思想和切合。
  3. 减少代码量。

对静态代理有个了解的读者可能就知道,静态代理的代码量比较庞大,所以动态代理是静态代理的升华。

2.动态代理的实现方式
jdk自带的动态代理主要是通过实现InvocationHandler

2.1 InvocationHandler的主要方法

  • Object invoke(Object proxy,
    Method method,
    Object[] args)
    throws Throwable
  • 在代理实例上处理方法调用并返回结果。在与方法关联的代理实例上调用方法时,将在调用处理程序上调用此方法。

2.2 方法详细介绍

  • 参数:
    proxy - 调用方法的代理实例对象 method - 代理实例对象调用的接口方法的 Method 实例对象。
    Method-对象的声明类将是在其中声明方法的接口,该接口可以是代理类赖以继承方法的代理接口的超接口。
    args -包含传入代理实例上方法调用的参数值的对象数组,如果接口方法不使用参数,则为 null。
  • 返回:
    从代理实例的方法调用返回的值。
  • 抛出: Throwable - 从代理实例上的方法调用抛出的异常。

3.具体登陆日志小案例(基于JDK动态代理)

3.1 业务接口 Login

public interface Login {
    public void login(String name);
}

3.2 业务实现类 LoginImpl

public class LoginImpl implements Login{
    @Override
    public void login(String name) {
        System.out.println("welcome "+name+", login success !!1");
    }
}

3.3 代理类 LoginProxy

public class LoginProxy implements InvocationHandler {

    private Object target;

    public LoginProxy(Object target) {
        this.target = target;
    }

    public static Object init(Object Object){
        return Proxy.newProxyInstance(Object.getClass().getClassLoader(),Object.getClass().getInterfaces(),new LoginProxy(Object));
    }

    /**
     * 切入点 对所有对象的方法都进行调用
     * method.invoke方法对应代理对象调用login方法
     * @param proxy 代理对象
     * @param method 代理对象的方法
     * @param args  代理对象调用接口方法的参数值
     * @return 代理对象调用方法的返回值
     * @throws Throwable
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        login(method);
        Object invoke = method.invoke(target, args);
        loginout(method);
        return invoke;
    }

    //日志的方法
    public void log(String msg){
        System.out.println(msg);
    }
    //执行前日志
    public void login(Method method){
        log(method.getName()+"方法执行之前调用的信息");
    }
    //执行后日志
    public void loginout(Method method){
        log(method.getName()+"方法执行之后调用的信息");
    }

}

3.4 测试类 LoginClient

public class LoginClient {
    public static void main(String[] args) {
        Login login = (Login) LoginProxy.init(new LoginImpl());
        login.login("zhangsan");
    }
}

3.5 执行结果:

从上面的例子我们可以看到动态代理有效的减少了各个模块的耦合度。
用于实现日志功能的代码和用于实现登陆功能的代码相互隔离。
只有在真正调用业务的时候并需要日志功能时候二者才发生联系。
任何业务需要日志功能只需要通过代理类创建代理对象即可。

总结:
代理对象机制是一种非常实用的设计模式,有利于程序的开发效率以及对于程序的后期维护。不必在关系各个模块之间的相互制约关系。

时间: 2024-11-09 00:41:09

java-动态代理的相关文章

Java动态代理机制分析及扩展,第2部分

本文希望将 Java 动态代理机制从接口扩展到类,使得类能够享有与接口类 似的动态代理支持. 设计及特点 新扩展的类名为 ProxyEx,将直接继承于 java.lang.reflect.Proxy,也声 明了与原 Proxy 类中同名的 public 静态方法,目的是保持与原代理机制在使 用方法上的完全一致. 图 1. ProxyEx 类继承图 与原代理机制最大的区别在于,动态生成的代理类将不再从 Proxy 类继承, 改而继承需被代理的类.由于 Java 的单继承原则,扩展代理机制所支持的类

Java动态代理机制分析及扩展,第1部分

引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要 简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所 有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可 以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.通过阅 读本文,读者将会对 Java 动态代理机制有更加深入的理解.本文首先从 Java 动态代理的运行机制和特点出发,对其代码进行了分析,推演了动态生成类的内 部实现. 代理:设计模式 代理是一种常用的设

Java 动态代理机制分析及扩展

简介: 本文通过分析 Java 动态代理的机制和特点,解读动态代理类的源代码,并且模拟推演了动态代理类的可能实现,向读者阐述了一个完整的 Java 动态代理运作过程,希望能帮助读者加深对 Java 动态代理的理解和应用. 引言 Java 动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的

java动态代理-如何理解Java的动态代理?

问题描述 如何理解Java的动态代理? Java的动态代理怎么理解? 哪位高手能详细解释一下这个问题,最好举个例子吧. 解决方案 彻底理解JAVA动态代理http://www.cnblogs.com/flyoung2008/archive/2013/08/11/3251148.html 解决方案二: Java动态代理详解

详解java动态代理模式_java

本文针对java动态代理进行知识点整理,具体内容如下 一. JAVA的动态代理(比较官方说法) 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处 理消息.过滤消息.把消息转发给委托类,以及事后处理消息等. 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的 对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提 供特定的服务. 按照代理的创建时期,代理类可以分为两种. 静态代理:由程序员创建或特定工

详解Java动态代理的实现机制_java

一.概述 代理是一种设计模式,其目的是为其他对象提供一个代理以控制对某个对象的访问,代理类负责为委托类预处理消息,过滤消息并转发消息以及进行消息被委托类执行后的后续处理.为了保持行为的一致性,代理类和委托类通常会实现相同的接口. 按照代理的创建时期,代理类可分为两种: 静态代理:由程序员创建代理类或特定工具自动生成源代码再对其编译,也就是说在程序运行前代理类的.class文件就已经存在.动态代理:在程序运行时运用反射机制动态创建生成. 下面在将动态代理的实现机制之前先简单介绍一下静态代理. 二.

求救,java动态代理问题!

问题描述 各位同学:如何得到Java动态代理方法Proxy.newProxyInstance产生的临时代理类的内部结构是什么? 解决方案 解决方案二:你看下这个类的原码吧.解决方案三:http://www.ibm.com/developerworks/cn/java/j-lo-proxy1/index.html?ca=drs-cn-0121我当时看动态代理的时候看过这篇文章,写的很好,推荐一下

java动态代理的基础问题

问题描述 java动态代理的基础问题 import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.List; import java.util.Vector; public class VectorProxy implements InvocationHandler { private Object pro

关于java动态代理的一个奇怪问题

问题描述 在使用java动态代理时遇到一个怪异的现象,不知道正不正常:由Proxy..newProxyInstance()生成的代理对象会同时代理除了接口以外的其他方法.源码如下:public interface Talkable {public void talk();public void cry();}public class Baby implements Talkable{@Overridepublic void cry() {System.out.println("Wa!!!!!!!

详解java动态代理的2种实现方式_java

java的动态代理在接java的api上有说明,这里就不写了.我理解的代理: 对特定接口中特定方法的功能进行扩展,这就是代理.代理是通过代理实例关联的调用处理程序对象调用方法. 下面通过一个例子看一下: 接口: public interface Num { void show(); int getNum(); int getProduct(int x); } 实现类: public class MyNum implements Num { @Override public int getNum(