`

java 用动态代理实现拦截器(转载)

阅读更多

拦截器是调用方法的改进.当称某个实例是拦截器是,这是就其行为上而言的;

从代码的角度来看,拦截器就是一个类,这个类也包含方法,只是这个方法是个特殊方法,它会在目标方法调用之前“自动”执行。

//拦截器方法大都是通过代理的方式来调用的
//jdk动态代理只能对实现了接口的实例来生成代理,因此必须提供一个接口:
public interface Dog {
public void info();
public void run();
}
//它的实现:
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("111111111模拟通用方法一!;);
}
public void method2(){
    System.out.println("222222222模拟通用方法二!;);
}
}
 
称其为拦截器,只是就它的行为而言,并不是它在代码实现上与普通java类有什么特别之处

关键是下面的ProxyHandler类,该类实现InvocationHandler接口,该接口可以动态调用目标对象的方法
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
public class ProxyHandler implements InvocationHandler {
private Object target;
DogIntercepter di = new DogIntercepter();
public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
   Object result = null;
   if(method.getName().equals("info")){
    di.method1();
    result = method.invoke(target, args);
    di.method2();
   }else{
    result = method.invoke(target, args);
   }
   return result;

}
public void setTarget(Object o){
   this.target = o;
}
}
 
其与上面的两个地方耦合:

2.与被拦截的方法耦合:上面类制定拦截器名为info的方法

这两个耦合也需要解决,通常的解决方案是将拦截器类放在配置文件中指定,将需要被拦截的目标方法也放在配置文件中指定。

系统还需要一个代理工厂,代理工厂的主要作用是更具目标对象生成一个代理对象。
public class MyProxyFactory {
public static Object getProxy(Object object){
   ProxyHandler handler = new ProxyHandler();
   handler.setTarget(object);
   //第一个参数是用来创建动态代理的ClassLoader对象,只要该对象能访问Dog接口即可
   //第二个参数是接口数组,正是代理该接口的数组
   //第三个参数是代理包含的处理实例
   return Proxy.newProxyInstance(DogImpl.class.getClassLoader(),
     object.getClass().getInterfaces(), handler);
}
}

 主程序:
public class TestDog {
public static void main(String[] args) {
   Dog targetObject = new DogImpl();

   Dog dog = null;

   Object proxy = MyProxyFactory.getProxy(targetObject);
   if(proxy instanceof Dog){
    dog = (Dog)proxy;
   }
   dog.info();
   dog.run();
}
}
 
分享到:
评论

相关推荐

    java代理实现webservice接口拦截器功能

    本文根据java代理实现CXF拦截器异常时只能进入fault拦截器而不能继续向下执行的问题。 利用java代理让RMI具有拦截器的功能。

    利用反射和动态代理机制实现自定义拦截器Interceptor

    利用反射和动态代理机制实现自定义拦截器Interceptor 在本文中,我们将探讨如何利用反射和动态代理机制来实现自定义拦截器Interceptor。拦截器Interceptor是一种常见的设计模式,用于在方法调用前后执行某些操作,...

    java 拦截器实现

    在Java中,我们可以使用`java.lang.reflect.InvocationHandler`接口来创建动态代理,实现拦截器的功能。 1. **JDK动态代理**: JDK动态代理是基于接口的,因此,只有当目标对象实现了至少一个接口时,我们才能使用...

    Struts2 拦截器 和 Java 中的动态代理

    Java中的动态代理(Dynamic Proxy)是实现拦截器机制的基础。动态代理允许我们在运行时创建一个实现了指定接口的新类。这个新类可以在方法调用前后插入自定义的行为,类似于拦截器的功能。Java的`java.lang.reflect....

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

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

    java 动态代理实现注解日志拦截

    在本场景中,我们将探讨如何使用Java动态代理结合注解来实现日志拦截,以便在调用方法时记录相关的日志信息。 首先,让我们了解Java动态代理的基本概念。在Java中,动态代理主要由两个类实现:`java.lang.reflect....

    由浅入深分析mybatis通过动态代理实现拦截器(插件)的原理

    `intercepter1`、`intercepter2`、`intercepter3`、`intercepter4` 这些文件可能是具体的拦截器实现示例或者与本文相关的代码片段。为了深入理解,你可以查看这些文件的内容,结合本文的讲解,进一步了解 MyBatis ...

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

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

    struts 拦截器动态代理

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

    Java Struts 实现拦截器

    ### Java Struts 实现拦截器的关键知识点 #### Struts2框架概述 Struts2是一个基于MVC(Model-View-Controller)设计模式的Java Web应用框架。它利用一系列的组件来处理用户请求并生成响应。其中,拦截器...

    Java动态代理两种实现方式

    Java提供了两种主要的动态代理实现方式:JDK自身的动态代理(基于接口)和Cglib库。 ### JDK动态代理 JDK动态代理是通过`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口来实现的。Proxy类...

    Java实现动态代理

    在Java编程中,动态代理是一种强大的技术,它允许我们在运行时创建对象的代理,这个代理对象可以拦截调用并执行额外的操作。动态代理通常用于实现AOP(面向切面编程)或者提供一种机制来增强对象的功能,比如日志、...

    Java SpringBoot实现的过滤器(和拦截器)控制登录页面跳转

    本项目主要关注的是如何使用过滤器(Filter)和拦截器(Interceptor)来实现登录页面的控制与跳转。以下是对这些知识点的详细说明: 1. **SpringBoot**: SpringBoot是Spring框架的一个子项目,旨在简化Spring应用...

    java分页 动态代理 aop实现

    动态代理是Java中的一种高级技术,它允许我们在运行时创建某个接口的代理类,实现对目标对象的增强或拦截。在Java中,有两种实现动态代理的方式: 1. Java.lang.reflect.Proxy:使用Proxy类和InvocationHandler接口...

    java动态代理实例

    3. **拦截器模式**:在Java动态代理中,我们可以使用`InvocationHandler`来实现拦截器。拦截器是一种设计模式,它允许我们在方法调用前后插入自定义的代码,比如事务管理、权限检查等。通过动态代理,我们可以轻松地...

    java 动态代理实现AOP

    ### Java动态代理实现AOP详解 #### 一、引言 随着软件开发复杂度的提升,传统的面向对象编程(OOP)已经...总之,通过本篇文章的学习,读者应该能够理解和掌握如何使用Java动态代理来实现AOP的基本原理及实践操作。

    使用Java动态代理实现一个简单的网络请求拦截器.txt

    ### 使用Java动态代理实现一个简单的网络请求拦截器 #### 一、引言 在软件开发过程中,为了增强程序的功能或方便进行调试与监控,我们常常需要在不改变原有业务逻辑的基础上,添加一些额外的行为(如日志记录、...

    ip黑白名单拦截器java示例

    以下将详细讲解基于Java实现的IP黑白名单拦截器及其核心概念。 首先,我们来看标题提及的“ip黑白名单拦截器java示例”。IP拦截器的主要任务是检查请求的源IP地址,如果该地址存在于黑名单中,拦截器会阻止其访问;...

Global site tag (gtag.js) - Google Analytics