`
隐形的翅膀
  • 浏览: 497397 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

使用JDK动态代理实现拦截器

阅读更多
Dog类
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();   
    }   
}
分享到:
评论

相关推荐

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

    在这个“jdk动态代理 + 拦截器实现小例”中,我们将探讨如何利用Java的InvocationHandler接口和Proxy类来实现拦截器模式,以实现灵活的代码扩展和日志记录、性能监控等需求。 首先,让我们理解什么是动态代理。在...

    Jdk动态代理,cglib动态代理,反射和拦截器(链)示例

    Java中的动态代理、反射和拦截器是面向对象编程中非常重要的技术,它们在实现灵活性、扩展性和代码解耦方面发挥着关键作用。本资源提供的示例涵盖了这些核心概念,通过JDK动态代理、CGLIB动态代理以及拦截器链的实践...

    JDK动态代理简单示例

    此外,Spring框架中的AOP功能也是基于JDK动态代理或CGLIB实现的,它允许开发者定义切面,对满足特定条件的方法进行拦截和增强。 总之,JDK动态代理为我们提供了一种灵活的代码扩展机制,使得在不修改原有代码的情况...

    JDK动态代理 spring aop 的原理

    总的来说,JDK动态代理是Spring AOP实现的基础,它允许我们在运行时动态创建代理对象,实现对方法调用的拦截和增强。Spring AOP则在此基础上提供了更高级的抽象,让我们可以方便地定义和管理切面,从而实现更灵活的...

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

    - **JDK动态代理**:适用于目标类已经实现接口的情况,使用简单,但只能针对接口进行代理。 - **CGLIB代理**:更适合未实现接口的类,更灵活,但生成代理类的速度较慢,因为涉及到字节码的生成。 总结: Java代理...

    struts 拦截器动态代理

    Struts拦截器是Java Web开发框架Struts2中的核心组件之一,它允许开发者在Action执行前后插入自定义的处理逻辑,实现AOP(面向切面...这种基于JDK动态代理实现的Struts拦截器,是Java Web开发中一种强大的设计模式。

    jdk动态代理模拟AOP拦截器

    NULL 博文链接:https://xxjkcyt.iteye.com/blog/1413467

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

    - **JDK代理**适用于目标类实现有接口的情况,更符合面向接口的设计原则,且无需引入额外的库。 - **CGLIB代理**适用于目标类没有接口或者不希望修改原有接口的情况,其性能通常优于JDK代理,因为它是基于字节码生成...

    jdk与cglib动态代理与底层实现

    - **JDK代理**:JDK动态代理使用反射和InvocationHandler接口生成一个实现了目标接口的新类。在运行时,这个新类的实例作为代理对象,它的方法调用都会转发到InvocationHandler的`invoke()`方法。 - **CGLIB代理**...

    JDK动态代理proxy

    下面是一个简单的JDK动态代理示例,我们创建一个计算服务接口`Calculator`,然后使用动态代理来实现该接口,并在代理对象中添加日志功能。 ```java // 目标接口 interface Calculator { int add(int a, int b); } ...

    java 拦截器实现

    创建一个简单的JDK动态代理拦截器: ```java interface MyService { void doSomething(); } class MyServiceImpl implements MyService { @Override public void doSomething() { System.out.println(...

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

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

    jdk动态代理 cglib3.0动态代理

    JDK代理基于接口,适用于简单场景;CGLIB通过字节码技术,适用于更复杂的需求。开发者可以根据项目需求选择合适的方法。对于学习和理解这两种动态代理机制,可以参考提供的博客链接,以及深入研究源码,这将有助于...

    JDK的动态代理总结

    在Java开发中,JDK的动态代理是一种非常重要的技术,它允许我们在运行时创建具有特定接口的代理类实例,从而实现代理对象对目标对象的方法调用进行拦截和增强。这篇博客将对JDK的动态代理进行深入的总结,探讨其原理...

    java jdk 动态代理演示demo

    下面将详细介绍这两个关键组件以及如何创建和使用动态代理。 首先,`java.lang.reflect.Proxy`是用于生成动态代理类的类。它提供了一个静态方法`newProxyInstance()`,这个方法接收三个参数:一个类加载器、一个...

    jdk动态代理课程代码.rar

    在压缩包中的“jdk动态代理”文件夹中,可能包含了演示如何创建和使用动态代理的Java源代码。通过分析这些代码,你可以更深入地理解动态代理的工作原理和实际应用。同时,配合博主的文章学习,可以更好地掌握动态...

    JDK动态代理demo

    在Java开发中,JDK动态代理是一个非常重要的技术特性,它允许我们在运行时创建一个类的代理对象,这个代理对象可以拦截对原对象的方法调用,并在调用前后执行额外的操作。这种技术常用于实现AOP(面向切面编程)或者...

    jdk动态代理使用[文].pdf

    在Java编程中,JDK动态代理是一种强大的工具,它允许我们在运行时创建代理类来拦截对目标对象的调用,从而实现额外的功能,比如日志记录、性能监控、事务管理等,而无需修改原始代码。这里我们将深入探讨JDK动态代理...

    JDK代理和Cglib代理

    JDK代理和Cglib代理是两种常用的动态代理实现方式。 **JDK代理(Java Dynamic Proxy)** JDK动态代理是Java标准库提供的一种代理机制,位于`java.lang.reflect`包下的`Proxy`类和`InvocationHandler`接口。JDK代理...

    java设计模式【之】JDK动态代理【源码】【场景:帮爸爸买菜】.rar

    * 动态代理(JDK代理、接口代理、拦截器模式) * 动态代理中的静态方法:java.lang.reflect.Proxy.newProxyInstance (ClassLoader(类加载器),interface(接口),handler(监听处理器)) * * 代码示例:《帮爸爸...

Global site tag (gtag.js) - Google Analytics