`
azrael6619
  • 浏览: 578289 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

JDK动态代理+实例

JDK 
阅读更多

拦截器:
1、首先要有一个目标对象,要拦截谁
2、拦截对象,拦截器本身只是一个普通的类
3、对目标对象所生成的一个代理对象,真正去执行的是代理对象,代理对象也是有若干个方法
由系统动态产生出来的,并不是我们去写出来的,代理对象的方法与目标对象的方法很类似,但是
代理对象的方法是综合了拦截器的方法和跟你的系统的目标对象的方法,将其综合起来,就形成了代
理对象的方法,也就是说代理方法是拦截器方法与目标对象方法的一个结合体

  

理清的关系:
    Target是目标对象,是目标,代理谁
    Interceptor是拦截器,将方法动态的插入到目标对象Target方法之前或是之后去执行
    这些Target与Interceptor互相不知道,Target不知道被谁插入,Interceptor也不知道插入到哪里。
因此在这声明一个MyHandler处理器,真正去调用目标对象方法,调用目标对象方法之前,执行拦截器的before

(),调用目标对象方法之后执行拦截器的after();
    还有一个最重要的代理对象MyProxy,有一个getProxy()方法,传过来目标对象,在此将目标对象set到处理器里

面去myHandler.setObject(object);然后返回一个代理实例,通过代理实例来调用目标对象的方法,目标对象方

法执行之后就会去调用拦截器,则相当于拦截器对其拦截了。


总结拦截器:
角色:
1、被拦截的对象或目标,目标对象的方法被拦截
2、拦截器本身,普通的class类,行为上来说起到了拦截别人的作用
3、代理,通过代理生成对目标对象的一个代理,执行的不是目标对象,而是代理,在代理中已经插入了拦截器

,这样的作用是降低偶合
目标对象与拦截器本身是互不关联的,低偶合,通过myHandler/myporxy来偶合,在struts2中是通过xml配置文件

来偶合的.代码程次是不偶合的.

 

拦截器底层实现就是动态代理实现的。

 

实例:

     因为JDK动态代理只能对实现了接口的实例来生成代理,故提供一个接口。

public interface Dog
{
    public void info();

    public void run();
}

 

 

  实现Dog类。

public class DogImpl implements Dog
{
    public void info()
    {
        System.out.println("我是一匹狼");
    }
    public void run()
    {
        System.out.println("我奔跑迅速");
    }
}

 

 

 拦截Dog实例的拦截器的拦截器类。

public class DogIntercepter
{
	public void method1()
	{
		System.out.println("=====模拟通用方法一=====");
	}

	public void method2()
	{
		System.out.println("=====模拟通用方法二=====");
	}
}

 

 

下面是JDK反射体系里的一个接口,它可以动态调用目标对象的方法。该类实现了java.lang.reflect.InvocationHandler接口。

public class ProxyHandler implements InvocationHandler
{
    private Object target;
	DogIntercepter di = new DogIntercepter();
    public Object invoke(Object proxy, Method method, Object[] args)throws Exception
    {
        Object result = null;
        if (method.getName().equals("info"))
        {
            di.method1();
            result = method.invoke(target, args);
            System.out.println("methodname=="+method.getName());
            System.out.println("target==="+target);
            System.out.println("proxy==="+proxy);
            di.method2();
        }
        else
        {
            result = method.invoke(target, args);
        }
        System.out.println("result="+result);
        return result;
    }
    public void setTarget(Object o)
    {
        this.target = o;
    }
}

 

 

系统还需要提供一个代理工厂,它的主要作用就是根据目标对象生成一个代理对象。

public class MyProxyFactory
{
    public static Object getProxy(Object object)
    {
       //Dog控制类 代理的操作类
        ProxyHandler handler = new ProxyHandler();
       //把该dog实例托付给代理操作
        handler.setTarget(object);
        //第一个参数是用来创建 动态代理 的ClassLoader对象,只要该对象能访问Dog接口即可。
        //也就只要DogImpl与Dog在同一
        System.out.println("111---"+object.getClass());
        System.out.println("222---"+object.getClass().getInterfaces()[0]);
        return Proxy.newProxyInstance(object.getClass().getClassLoader(),object.getClass().getInterfaces(),handler);
    }
} 

Proxy.newProxyInstance方法根据接口数组动态创建代理实例,接口数组通过object.getClass().getInterfaces()方法获得,该类实现传入参数里接口数组的全部接口,因此Dynamic Proxy要求被代理的必须是接口的实现类,否则无法为其构造相应的动态实例。

 

 

下面是主程序:

public class TestDog
{
    public static void main(String[] args) 
    {
        Dog targetObject = new DogImpl();
		Dog dog = null;
        Object proxy = MyProxyFactory.getProxy(targetObject);
        System.out.println("proxy="+proxy.getClass().getName());
        if (proxy instanceof Dog)
        {
            dog = (Dog)proxy;
            System.out.println(dog.getClass());
        }
          dog.info();//dog是代理类,当它调用方法时,会自动调用InvocationHandler子类的invoke方法
          dog.run();
    }
}

 

以上就是一个简单的代理实现过程。

其实动态代理就是动态地帮你写了一个代理类,并实现了被代理接口。这个代理类$proxy0的父类把InvocationHandler实现聚合进来(h属性), 这样客户端可以强转成被代理接口(因为代理类也实现了这个接口),调用的时候动态代理类就调用父类的h.invoke()(h也就是你的InvocationHandler实现),h里面再调用target的这个方法,也就是真正的方法调用。从而达到动态调用的作用。

分享到:
评论

相关推荐

    jdk动态代理 + 拦截器实现小例

    Proxy类提供了静态方法`newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h)`用于创建代理实例,其中loader是类加载器,interfaces是被代理的接口数组,h是实现InvocationHandler的实例...

    浅谈JDK动态代理与CGLIB代理去区别

    本篇文章将深入探讨JDK动态代理和CGLIB代理的区别,以及它们在实际应用中的选择。 首先,JDK动态代理主要依赖于java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类用于创建一个代理对象...

    JDK动态代理_JDK动态代理

    ### JDK动态代理详解 #### 一、引言 在软件工程中,代理模式是一种常见的设计模式,它通过为一个对象提供一个替代品或占位符来控制对这个对象的访问。这种模式通常用于添加额外的功能(例如日志记录、事务管理等)...

    关于jdk动态代理的源码剖析

    ### 关于JDK动态代理的源码剖析 #### 一、引言 在Java开发过程中,动态代理技术是一项非常实用的技术,它可以帮助我们实现在不修改原有代码的基础上为方法增加额外的功能,比如日志记录、权限校验等。本文将深入...

    JDK动态代理简单示例

    JDK动态代理是Java编程中一个非常重要的特性,它允许我们在运行时创建具有特定接口的代理类实例。这种技术在很多场景下都非常有用,比如在AOP(面向切面编程)中实现方法拦截、日志记录、事务管理等。下面我们将深入...

    java 动态代理实例(JDK代理与CGLIB代理)

    动态代理主要分为两种:JDK代理和CGLIB代理。 **JDK代理**是基于接口的代理,它通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。当我们的目标对象实现了特定的接口时,我们可以...

    jdk动态代理技术详解

    JDK 动态代理技术详解 JDK 动态代理技术是 Java 语言自身对动态代理的支持,类似于 JDK 中在 java.util 包中提供 Observable 类和 Observer 接口提供对观察者模式的语言级支持。动态代理的优点是可以动态地为软件...

    JDK动态代理源码

    在Java编程领域,JDK动态代理是一个非常重要的概念,它允许我们在运行时动态地创建一个实现了特定接口的代理对象,以此来拦截并扩展原有对象的行为。动态代理在很多场景下都有应用,比如AOP(面向切面编程)、事件...

    JDK动态代理 spring aop 的原理

    在Java编程领域,JDK动态代理是实现动态创建代理对象的一种技术,它是Java标准库提供的一种强大工具。Spring AOP(面向切面编程)则是一种流行的应用框架,它利用动态代理来实现对业务代码的切面增强,如日志、事务...

    jdk+tomcat+nginx+redis+session共享从头搭建一套完整服务

    在Nginx中配置负载均衡,你需要定义一个upstream块,指定后端服务器(如多个Tomcat实例),然后在server块中使用proxy_pass指令将请求转发到upstream。同时,Nginx还可以缓存静态资源,进一步提升响应速度。 为了...

    jdk动态代理和CGlib动态代理

    JDK动态代理和CGlib动态代理是Java中实现这一目标的两种主要方式。 ### JDK动态代理 JDK动态代理基于Java的接口实现。如果一个类实现了至少一个接口,我们就可以为这个类创建一个动态代理。动态代理通过`java.lang....

    java代理机制 JDK动态代理和cglib代理 详解

    本文将深入探讨两种主要的Java代理实现:JDK动态代理和CGLIB代理。 一、JDK动态代理 JDK动态代理基于接口实现,它要求被代理的类必须实现至少一个接口。在运行时,Java会动态地创建一个新的类,这个类实现了与原始...

    代理模式,JDK动态代理,SpringAOP来龙去脉

    - Proxy通过`Proxy.newProxyInstance()`方法创建一个新的代理实例,它接收三个参数:类加载器、接口数组和InvocationHandler实例。代理对象会实现传入的接口,这样就可以在运行时调用这些接口的方法。 - 代理对象...

    JDK动态代理和Cglib动态代理实例源码

    本篇将详细探讨JDK动态代理和Cglib动态代理,并通过源码实例来加深理解。 首先,JDK动态代理是Java内置的一种机制,它依赖于`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。`Proxy`类...

    spring jdk动态代理

    本文将深入探讨Spring如何利用JDK动态代理技术来实现这一功能,并通过实例解析其底层实现。 首先,让我们理解什么是JDK动态代理。在Java中,动态代理是一种在运行时创建代理类的能力,它允许我们为一组接口创建代理...

    Jdk动态代理和cglib动态代理原理

    - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成的子类,而JDK代理需要反射调用接口方法。 在实际开发中,如Spring AOP框架就同时支持JDK和...

    模拟JDK动态代理内部实现

    在本文中,我们将深入探讨如何模拟JDK的动态代理内部实现。 首先,我们需要了解JDK动态代理的基础知识。Java中的动态代理通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口实现。`Proxy...

    java jdk 动态代理 演示demo

    Java JDK 动态代理是一种强大的特性,它允许我们在运行时创建代理对象,这些代理对象可以扩展或增强已存在的接口实现。动态代理在处理AOP(面向切面编程)场景、事件监听、性能监控等方面有着广泛的应用。下面我们将...

    JDK动态代理proxy

    JDK动态代理,全称为Java Dynamic Proxy,是Java标准库提供的一种强大且灵活的机制,允许我们在运行时创建代理类来实现指定的接口。这种机制主要用于实现AOP(面向切面编程)或为已有接口提供额外的功能,如日志、...

    java动态代理实例(jdk动态代理和cglib)

    本篇将深入探讨两种主要的Java动态代理技术:JDK动态代理和CGLIB。 首先,我们来了解一下JDK动态代理。JDK动态代理基于Java反射API实现,主要用于接口代理。以下是一个简单的JDK动态代理的使用步骤: 1. **定义...

Global site tag (gtag.js) - Google Analytics