java动态代理框架

java动态代理是一个挺有意思的东西,他有时候可以被使用的很灵活。像rpc的调用,调用方只是定义的一个接口,动态代理让他匹配上对应的不同接口;mybatis内部的实现,编码时,只是实现了mapper层的接口和sql的xml的配置,动态代理把他们连起来。记得之前在一家公司,他们使用thrift做rpc的解决方案,每个项目都得管理thrift的连接和关闭,代码考来考去,在spring下还得不断new对象。后来参照mybatis的实现方式,使用动态代理,做成spring注入的方式,方便很多,程序员只需要加些配置就好了。

先来一个动态代理的简单实例:

/**
 * Created by sten on 7/12/16.
 */
public interface Person {

    void eat() ;
}

/**
 * Created by sten on 7/12/16.
 */
public class Chinese implements Person {

    @Override
    public void eat() {
        System.out.print("eat fish.");
    }
}

/**
 * Created by sten on 7/12/16.
 */
public class InvocationTest implements InvocationHandler {

    private Person person ;

    public InvocationTest(Person person) {
        this.person = person ;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        return method.invoke(person, args);
    }
}

/**
 * Created by sten on 7/12/16.
 */
public class Main {

    public static void main(String[] args) {

        Chinese chinese = new Chinese() ;

        Person person = (Person) Proxy.newProxyInstance(Person.class.getClassLoader(),
                new Class[]{Person.class},
                new InvocationTest(chinese));

        person.eat();
    }

}

这是一般动态代理的范式,Chinese代理Person的实现,接口person每个方法的调用,实际执行的方法是InvocationTest.invoke, 当然,还有动态代理还有其他实现方式。

这里实现简单实现下mybatis的动态代理:

假设解析完mapper和xml,知道每个mapper的方法对应的sql了,通过类名和方法名,就可以执行sql

/**
 * Created by sten on 7/12/16.
 */
public class SqlMap {

    private Map<String, String> map = new HashedMap() ;

    public SqlMap() {
        map.put("Class1.method1","select sql1") ;
        map.put("Class1.method2","delete sql1") ;
        map.put("Class1.method3","update sql1") ;
        map.put("Class1.method4","insert sql1") ;
        map.put("Class2.method1","select sql2") ;
        map.put("Class2.method2","delete sql2") ;
        map.put("Class2.method3","update sql2") ;
        map.put("Class2.method4","insert sql2") ;
    }

    public String getSql(String classNameMethodName) {
        return  map.get(classNameMethodName) ;
    }

}

假设定义的一个mapper

/**
 * Created by sten on 7/12/16.
 */
public interface Class1 {

    String method1() ;

    String method2() ;

    String method3() ;

    String method4() ;
}

InvocationHandler的实现

/**
 * Created by sten on 7/12/16.
 */
public class InvocationSql implements InvocationHandler {

    private Class interfaceObject ;

    private SqlMap sqlMap ;

    public InvocationSql(Class interfaceObject, SqlMap sqlMap) {
        this.interfaceObject = interfaceObject ;
        this.sqlMap = sqlMap ;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        String key = interfaceObject.getClass().getName() + "." + method.getName() ;
        String value = sqlMap.getSql(key) ;

        return value ;
    }
}

根据mapper接口生成对象

/**
 * Created by sten on 7/12/16.
 */
public class TargetProxy<T> {

    public T  getTarget(Class<T> interfaceObject, SqlMap sqlMap) {

        InvocationSql invocationSql = new InvocationSql(interfaceObject, sqlMap) ;

        return (T)newProxyInstance(interfaceObject.getClassLoader(),new Class[] {interfaceObject},
                invocationSql) ;
    }

}

执行生成的对象

/**
 * Created by sten on 7/12/16.
 */
public class Bitis {

    public static void main(String[] args) {

        TargetProxy targetProxy = new TargetProxy() ;

        Class1 class1 = (Class1) targetProxy.getTarget(Class1.class, new SqlMap());

        class1.method1() ;
    }

}
时间: 2024-10-24 18:10:09

java动态代理框架的相关文章

理解java动态代理

java动态代理是java语言的一项高级特性.在平时的项目开发中,可能很难遇到动态代理的案例.但是动态代理在很多框架中起着不可替代的作用,例如Spring的AOP.今天我们就聊一聊java动态代理的实现原理. jdk对于动态代理的支持主要依赖于两个类:Proxy和InvocationHandler.我们先看一下类图. Subject类是主题类,定义了我要做什么.我们需要代理的类即实现Subject接口的RealSubject. 1.InvocationHandler InvocationHand

java动态代理的实现

动态代理作为代理模式的一种扩展形式,广泛应用于框架(尤其是基于AOP的框架)的设计与开发,本文将通过实例来讲解Java动态代理的实现过程. 友情提示:本文略有难度,读者需具备代理模式相关基础知识,. 通常情况下,代理模式中的每一个代理类在编译之后都会生成一个class文件,代理类所实现的接口和所代理的方法都被固定,这种代理被称之为静态代理(Static Proxy).那么有没有一种机制能够让系统在运行时动态创建代理类?答案就是本文将要介绍的动态代理(Dynamic Proxy).动态代理是一种较

【转载】Java动态代理

转自:http://blog.csdn.net/heyutao007/article/details/49738887 AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执行.不同的切入时机对应不同的Interceptor的种类,如BeforeAdviseInterceptor,AfterAdviseInterceptor以及ThrowsAdvise

java动态代理原理及解析

代理:设计模式 代理模式是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个真实对象的访问.代理类负责为委托类预处理消息,过滤消息并转发消息,以及进行消息被委托类执行后的后续处理. 通过代理层这一中间层,有效的控制对于真实委托类对象的直接访问,同时可以实现自定义的控制策略(Spring的AOP机制),设计上获得更大的灵活性. java动态代理的类和接口(jdk1.6源码) 1,java.lang.reflect.Proxy:动态代理机制的主类,提供一组静态方法为一组接口动态的生成对

alljoyn:基于java动态代理的RPC实现原理分析

alljoyn是由高通开源,allseen组织下,作为IOT的一个开源软件框架. 本文分析它的core部分的远程调用方法的实现过程. 以android core sdk的release版本中的simple程序为例子. (eg alljoyn-14.06.00a-android-sdk-rel\alljoyn-android\core\alljoyn-14.06.00a-rel\java\samples\simple\client) 1. 下面是一个定义为alljoyn接口,并定义了一个远程调用方

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

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

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

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

java动态代理技术

主要用来做方法的增强.让你能够在不改动源代码的情况下,增强一些方法,在方法运行前后做不论什么你想做的事情(甚至根本不去运行这种方法).由于在InvocationHandler的invoke方法中,你能够直接获取正在调用方法相应的Method对象.详细应用的话.比方能够加入调用日志,做事务控制等. 另一个有趣的作用是能够用作远程调用,比方如今有Java接口,这个接口的实现部署在其他server上,在编写client代码的时候,没办法直接调用接口方法,由于接口是不能直接生成对象的,这个时候就能够考虑

java高级----&gt;Java动态代理的原理

Java动态代理机制的出现,使得 Java 开发人员不用手工编写代理类,只要简单地指定一组接口及委托类对象,便能动态地获得代理类.代理类会负责将所有的方法调用分派到委托对象上反射执行,在分派执行的过程中,开发人员还可以按需调整委托类对象及其功能,这是一套非常灵活有弹性的代理框架.下面我们开始动态代理的学习. 目录导航   动态代理的简要说明 简单的Java代理 Java的动态代理 Java动态代理的原理 友情链接 动态代理的简要说明 在java的动态代理机制中,有两个重要的类或接口,一个是 In