JavaJava学习笔记–JDK动态代理

1.JDK动态代理

    JDK1.3未来,Java提供了动态代理的技能,允许开发者在运行期创制接口的代办实例。JDK的动态代理第一涉嫌到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中InvocationHandler是一个接口,可以经过兑现该接口定义横切逻辑,并透过反射机制调用目的的代码,动态将横切逻辑和业务逻辑编织在一块。而Proxy利用InvocationHandler动态创造一个顺应某一接口的实例,生成目的类的代办对象。

    通过应用动态代理,可以在运作时动态创造出同时落到实处七个Java接口的连锁代理类及其对象实例。当客户代码通过那些被代理的接口来拜访其中的主意时,相关的调用新闻就会被传送给代理中的一个特殊对象进行拍卖,处理的结果作为艺术调用的结果回到。客户代码看到的只是接口,具体的逻辑被封装在代理的兑现中。

    动态代理体制的精锐之处在于可以在运转时动态完结多少个接口,而不须求在源代码中经过inplements关键词来声称。同时,动态代理把对接口中的方法调用的拍卖逻辑交给开发人士,让开发人士可以灵活处理。通过动态代理能够兑现面向对象编程(AOP)中的常见的法门阻碍功效。

2.基本选拔方法

    使用动态代理时只须求精晓七个元素即可:第四个是要代理的接口,别的一个是处理接口方法调用的java.lang.reflect.InvocationHandler。动态代理只协助对接口提供代理,一般的Java类是卓越的。要是要代理的接口不是真心诚意的,那么被代理的接口和开创动态代理的代码必须在同一个包中。在开创动态处理的时候,要求提供InvocationHandler接口的兑现,以拍卖实际的调用。在举行拍卖的时候可以获取代表其实调用方法的Method对象和调用的实际上参数列表。

InvocationHandler接口的落到实处类的演示

public class LoggingInvocationHandler implements InvocationHandler{
    private static final Logger logger = Logger.getLogger(LoggingInvocationHandler.class);
    private Object target;
    public LoggingInvocationHandler(Object obj){
        this.target = obj;
    }

    public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
        logger.log(Level.Info + "调用方法" + method.getName() + ":参数为" + Arrays.deepToString(args));
        return method.invoke(target,args);
    }
}

创制和行使动态代理的言传身教

public static void useProxy(){
    String str = "Hello World";
    LoggingInvocationHandler handler = new LoggerInvocationHandler(str);
    ClassLoaser cl = SimpleProxy.class.getClassLoader();
    Comparable obj = (Comparable)Proxy.newProxyInstance(cl,new Class[]{Comparable},handler);
    obj.comparedTo("Good");
}

代码表明:

    创建动态代理时需求一个InvocationHandler接口的兑现,那是应用的的是地点的LoggingInvocationHandler类的实例。动态代理的创造是由java.lang.reflect.Proxy类的静态方法newProxyInstance来成功的。创造时索要提供类加载器实例、被代理的接口列表以及InvocationHandler接口的兑现。在创立达成将来,须求通过类型转换把代理对象转换成被代理的某部接口来选拔。

    就算LoggingInvocationHandler类只是不难地记录了日志,并没有改变方法的实际上履行,不过实际上,在InvocationHandler接口的invoke方法中可以兑现种种各类复杂的逻辑。比如对实在调用参数进行更换,或者是改变实际调用的措施,仍能够对调用的回到结果开展改动。开发人员可以自己的急需,添加感兴趣的事务逻辑。那实际就是AOP中常用的方法阻碍,即拦截一个方法调用,以在其上附加所需的政工逻辑。InvocationHandler很符合于封装一些横切(cross-cutting)的代码逻辑,包含日志、参数检查与校验、相当处理和再次来到值归一化等。

    一般的话,在开立一个动态代理的InvocationHandler实例的时候,需求把原有的点子调用的接受者对象也传进去,以便于执行原始的法门调用。这足以在创制InvocationHandler的时候,通过构造方法来传递。在半数以上意况下,代理对象只会促成一个Java接口。对于那种意况,可以组合泛型来开发一个通用的厂子方法,以成立代理对象。

为别的接口及其完毕类创建代理的厂子方法

public static <T>T makeProxy(Class<T> clazz,final T target,InovcationHandler handler){
    ClassLoader classLoader = target.getClass().getClassLoader();
    return (T) Proxy.newProxyInstance(classLoader,new Class<?>[]{clazz},handler)
}

相关文章