模式的秘密-代理模式(2)-JDK动态代理

代理模式-动态代理

(1)

(2)

代码实践动态代理:

第一步:被代理类的接口:

package com.JdkProxy;

public interface Moveable {

    void move();

}

第二步:被代理类:

package com.JdkProxy;

import java.util.Random;

public class Car implements Moveable {

    @Override
    public void move()
    {

        //实现开车
        try {
            Thread.sleep(new Random().nextInt(1000));
            System.out.println("汽车行驶中....");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

第三步:代理类:实现接口:InvocationHandler,同时把被代理类对象接口传入构造方法,

重写的接口的invoke方法。

package com.JdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

public class TimeHandler implements InvocationHandler {

    private Object target;

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

    /*
     * 参数:
     * proxy:被代理对象
     * method:被代理对象方法
     * arg:方法的参数
     * 返回值:
     * Object 方法的返回值
     * */
    @Override
    public Object invoke(Object proxy, Method method, Object[] arg) throws Throwable {

        long starttime=System.currentTimeMillis();
        System.out.println("汽车开始形式....");

        method.invoke(target);

        long endtime=System.currentTimeMillis();
        System.out.println("汽车结束行驶...汽车形式时间:"+(endtime-starttime)+"毫秒");

        return null;
    }

}

测试类中实现代理:

使用Proxy类的newProxyInstance方法产生一个被代理类的实例,该实例可以当作被代理类使用接口(对应cls.getInterfaces())中声明过的方法。

package com.JdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

public class Test {

    /*JDK动态代理测试类
     * */
    public static void main(String[] args) {

        Car car=new Car();

        //InvocationHandler是一个接口,接口中定义了一个方法invoke。要想实现JDK动态代理,
        //代理类必须继承这个接口
        InvocationHandler h=new TimeHandler(car);//
        Class cls=car.getClass();//获取类对象,以便获取类加载器,以及获取类的接口

        /*
         * newProxyInstance返回代理类的实例,返回后的代理类可以当作被代理类使用
         * (可使用被代理类的接口中声明过的方法)
         * loader:类加载器
         * interfaces:实现接口
         * h:InvocationHandler
         * */
        Moveable m=(Moveable) Proxy.newProxyInstance(cls.getClassLoader(),
                cls.getInterfaces(), h);
        m.move();

    }

}

测试结果:

汽车开始形式....
汽车行驶中....
汽车结束行驶...汽车形式时间:863毫秒

代理模式-动态代理

所以动态代理是这样一种Class:

  • 他在运行时候产生了的Class
  • 该class需要实现一组interface
  • 使用动态代理类时,必须实现InvocationHandler接口

动态代理实现步骤

1,创建一个实现InvocationHandler的类,他必须实现Invoke方法

2,创建被代理的类以及接口

3,调用Proxy的静态方法,创建一个代理类:

newProxyInstance(ClassLoader,class[] interfaces,InvocationHandler  h)。

4,通过代理调用方法。

jdk动态代理只能实现了接口的类。

原文地址:https://www.cnblogs.com/alsf/p/8508425.html

时间: 2024-11-05 22:58:45

模式的秘密-代理模式(2)-JDK动态代理的相关文章

重温Spring之旅5——AOP代理对象、JDK动态代理、使用cglib生产代理

AOP--代理对象 代理模式:代理模式的英文叫做Proxy或Surrogate,中文都可译为"代理",所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动.在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用. 抽象主题角色:声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题. 代理主题(Proxy)角色:代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象:

动态代理模式——JDK动态代理

今天,我就来讲一下动态代理的设计模式. 动态代理的意义在于生成一个代理对象,来代理真实对象,从而控制真实对象的访问.操作动态代理需要两个步骤:一.代理对象和真实对象建立代理关系.二.实现代理对象的代理逻辑方法. 在Java中,有很多的动态代理技术.如:JDK.CGLIB.Javassist.ASM,其中最常用的动态代理技术有两种:一种是JDK动态代理,这是JDK自带的功能:另一种就是CGLIB,这是第三方提供的一种技术. 这次主要讲的是JDK动态代理和CGLIB动态代理.在JDK动态代理中,我们

Java进阶之 JDK动态代理与Cglib动态代理

一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern]), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意: 1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于AspectJ较差 二.JDK动态代理 [对有实现接口的对象做代理] 1.JDK动态代理中 需要了解的

JDK动态代理与Cglib动态代理(转载)

spring容器通过动态代理再结合java反射思想可以使得方法调用更加简洁 一.动态代理概述: 与静态代理对照(关于静态代理的介绍 可以阅读上一篇:JAVA设计模式之 代理模式[Proxy Pattern](博主), 动态代理类的字节码是在程序运行时由Java反射机制动态生成. 注意:       1.AspectJ是采用编译时生成AOP代理类,具有更好的性能,但是需要使用特定的编译器进行处理 2.Spring AOP采用运行时生成AOP代理类,无需使用特定编译器进行处理,但是性能相对于Aspe

Spring AOP基础之JDK动态代理

JDK动态代理 Jdk动态代理是装饰模式的一个典型用例,关于装饰模式这里不多解释,直接说重点吧.jdk动态代理实际上就是代替继承方案,在不破坏原始类的原则下,在运行期间为某个类动态注入一些新的方法.java.lang.reflect.Proxy提供了生成代理类的接口.进入源代码,我们可以看见关于Proxy的详细说明这里截取一些关键的部分: /** * {@code Proxy} provides static methods for creating dynamic proxy * classe

模拟JDK动态代理实现

JDK动态代理 在JDK1.3以后提供了动态代理的技术,允许开发者在运行期创建接口的代理实例.在Sun刚推出动态代理时,还很难想象它有多大的实际用途,现在动态代理是实现AOP的绝好底层技术. JDK的动态代理主要涉及java.lang.reflect包中的两个类:Proxy和InvocationHandler.其中InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一起.而Proxy为InvocationHa

CGlib和JDK动态代理

一.CGlib动态代理 JDK实现动态代理需要实现类通过接口定义业务方法,对于没有接口的类,如何实现动态代理呢,这就需要CGLib了.CGLib采用了非常底层的1:字节码技术,其原理是通过字节码技术为一个类创建子类,并在子类中采用2:方法拦截的技术拦截所有父类方法的调用,顺势织入横切逻辑.JDK动态代理与CGLib动态代理均是实现Spring AOP的基础. 字节码技术:参考:http://note.youdao.com/noteshare?id=13453e8d815d3102938a0288

JDK动态代理[1]----代理模式实现方式的概要介绍

日常工作中经常会接触到代理模式,但一直没有对其进行深究.代理模式一直就像一团迷雾一样存在我心里,什么是代理模式?为什么要使用代理?代理模式有哪些实现?它的底层机制是怎样的?这些问题促使着我迫切想要揭开代理模式的神秘面纱. 1. 什么是代理模式? 日常生活中我们经常会碰到代理模式,例如我们找房产中介帮我们介绍房子,找婚姻中介帮我们介绍对象,找保洁帮我们打理房间,找律师帮我们进行诉讼等.我们在无形中运用到了代理模式,却不知道它的存在. 2. 为什么要使用代理? 运用代理可以使我们的生活更加便利,有了

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

CGLIB与JDK动态代理区别 区别: java动态代理是利用反射机制生成一个实现代理接口的匿名类,在调用具体方法前调用InvokeHandler来处理.而cglib动态代理是利用asm开源包,对代理对象类的class文件加载进来,通过修改其字节码生成子类来处理. 1.如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP 2.如果目标对象实现了接口,可以强制使用CGLIB实现AOP 3.如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB