JFinal的拦截器笔记

InterCeptor

1>>>>>>

Method级别的拦截器:

用@Before(xxx.class)给某个方法添加一个拦截器:

//测试methodInterceptor的用法

   @Before(MethodInterceptor.class)

   publicvoid testMethod(){

     render("index.html");

   }

作用只在这个方法上边生效,而在其他的方法上边不生效的。

结果可以从控制台看出来,如下,当访问默认的index的时候,只有一个interceptor,而访问具体的某个方法的时候,会出现具体的某个方法的MethodInterceptor:如下:

2>>>>>

Class级别的Interceptor,如下:

@Before(ClassInterceptor.class)//class级别

publicclass FrontController extendsController {

   publicvoid index(){

      setAttr("msg", "Hello,JFinal!");

      render("index.html");

   }

  

   //测试methodInterceptor的用法

   @Before(MethodInterceptor.class) //method级别

   publicvoid testMethod(){

      render("index.html");

   }

}

当访问的时候,是Class级别的在整个类里面的方法都会执行该拦截器,但是method级别的只是在特定的方法上边执行的,执行的顺序是限制性Class级别的,在执行Method级别的,如下;

3>>>>>

Global级别的拦截器:

在Config.java中配置:

  @Override

  publicvoid configInterceptor(Interceptors me) {

    me.add(new GlobalInterceptor());//配置全局的拦截器

    //me.addGlobalActionInterceptor(newGlobalInterceptor());//拦截所有的Action

  }

测试结果如下,先执行全局,在执行class,最后执行Method级别的拦截器:

Inject拦截器的效果

4>>>>>

通过DuangDuang让一个类拥有AOP的能力:

Inject增强(方法级别):

//serviceImp是我们需要增强的类

publicclass ServiceImp {

  @Before(InjectInterceptor.class)

  publicvoid testInject(){

    System.out.println("testInject");

  }

  publicvoid commenInject(){

    System.out.println("commen~~~~~");

  }

}

如果没有在方法上边增强,就不会调用拦截器,如果增强的话,就会调用,如下,testInject被增强了,而Comment是没有增强的

如果将其设置成类级别的拦截器,则不管某个方法增强与否,都会执行该拦截器:如下的testInjec和commen都执行了InjectInterceptor拦截器:

5>>>

通过DuangDuang让一个类拥有AOP的能力:关键是在调用的action中进行Duang增强,即在其方法上边进行拦截:

   publicvoid InjectMethod(){

   System.out.println("================================");

      //关键如下:

      ServiceImp service=Duang.duang(ServiceImp.class);

      service.testInject();

      service.commenInject();

      System.out.println("=================================");

      //关键如下:会在具体的方法进行增强

      ServiceImp2 service2=Duang.duang(ServiceImp2.class);

      service2.testInject();

      service2.commenInject();

      render("index.html");

   }

配置全局的service的拦截器:

  @Override

  publicvoid configInterceptor(Interceptors me) {

    //me.add(newGlobalInterceptor());//配置全局的拦截器

    //me.addGlobalActionInterceptor(newGlobalInterceptor());//拦截所有的Action

    me.addGlobalServiceInterceptor(new InjectInterceptor());//配置全局的service的拦截器

  }

其中的service类如下:

serviceImp2

//serviceImp2是我们需要增强的类

publicclass ServiceImp2 {

   publicvoid testInject(){

      System.out.println("testInject2~~~~~~~");

   }

   publicvoid commenInject(){

      System.out.println("commen2~~~~~");

   }

}

ServiceImp

//serviceImp是我们需要增强的类

//@Before(InjectInterceptor.class)

publicclass ServiceImp {

   //@Before(InjectInterceptor.class)

   publicvoid testInject(){

      System.out.println("testInject");

   }

   publicvoid commenInject(){

      System.out.println("commen~~~~~");

   }

}

 

结果如下:

会在每一个方法上边进行增强。

总结:

1~~~~~

me.addGlobalServiceInterceptor(newInjectInterceptor());

这个是通过DUangDuang给每个目标类进行增强,动态为一些业务方法增强。

2~~~

1me.add(new GlobalInterceptor());

2me.addGlobalActionInterceptor(newGlobalInterceptor());

3me.addGlobalServiceInterceptor(new InjectInterceptor());

前两个是一样的,底层都是相同的实现,但是第三个是配置DUangDuang使用。

Enhancer

实际和DUangDuang是一个效果,可以互相替换

   publicvoid InjectMethod(){

      System.out.println("================================");

      //关键如下:

      ServiceImpservice=Duang.duang(ServiceImp.class);

      service.testInject();

      service.commenInject();

      System.out.println("=================================");

      //关键如下:

      ServiceImp2service2=Duang.duang(ServiceImp2.class);

      service2.testInject();

      service2.commenInject();

      System.out.println("=================Enhancer方法================");

//关键如下:

//ServiceImp3service3=Duang.duang(ServiceImp3.class);

ServiceImp3 service3=Enhancer.

enhance(ServiceImp3.class,InjectInterceptor.class);

      service3.testInject();

      service3.commenInject();

      render("index.html");

   }

但是在Config.java中没有设置拦截器

如下:

   @Override

   publicvoid configInterceptor(Interceptors me) {

      //me.add(newGlobalInterceptor());//配置全局的拦截器

      //me.addGlobalActionInterceptor(newGlobalInterceptor());//拦截所有的Action

      //me.addGlobalServiceInterceptor(newInjectInterceptor());//配置全局的service的拦截器

   }

 

结果如下:在没有在Enhancer中设置增强的上边没有增强,而在设置了增强的方法上边进行了增强。

注意:DUangDuangEnhancerEnhancer是一样的。

拦截器栈

多个Interceptor组成拦截器栈,如下:

   //多个拦截器的时候用{},执行的顺序从左到右,级别从高到低执行

   @Before({AInterceptor.class,BInterceptor.class})

   publicvoid testInterceptorStack(){

      renderTemplate("index.html");

   }

这个是用在了method级别的拦截器栈,其他Class级别,全局级别的同理。

结果如下:

其执行的顺序是按照从左到右,级别是从高到低。

Clear注解

不带参数的,不带参数的可以清除本身以上的所有的拦截器。可以是method级别,也可以是Class级别等。

带参数的,带参数的可以清除本身以上的参数中指定的拦截器。

注意:如果带参数的,其中有自己的拦截器,这时候是不起作用的

比如:

1>>>

 

@Before(AInterceptor.class)

@Clear({AInterceptor.class,BInterceptor.class,CInterceptor.class})

public void   inter(){

         renderTemplate(“index.jsp”);

}

此时是清除不掉AInterceptor这个拦截器的,因为只是对本身以上的才起作用的。

2>>>

@Before({AInterceptor.class,BInterceptor.class,CInterceptor.class})

Class A {

@Clear({AInterceptor.class})

public void   inter(){

    renderTemplate(“index.jsp”);

}

}

上边这个例子可以吧AInterceptor这个拦截器清除掉。

3>>>

Before(ClassInterceptor.class)

publicclass FrontController extendsController {

   //测试methodInterceptor的用法

   @Before(MethodInterceptor.class)

   @Clear

   publicvoid testMethod(){

      render("index.html");

   }

注意:上边这个例子可以清除的是ClassInterceptor这个拦截器,而不会清除本身的MethodInterceptor这个拦截器的,需要注意。

总结:

上边的这几个Clear注解和拦截器的使用差不多是一样的,既可以是Global、Inject、Class、Method级别的等等,也可以使用拦截器栈,即在Clear({})中使用{}来指定来清除多个拦截器。

拦截器的总结:

拦截器的优先级别:

1.     Global

2.     Inject (InjectorInterceptor、RouterInterceptor)

3.     Class

4.     Method

<think>好的,我现在需要处理用户关于韩顺平笔记中反射内容的查询。首先,用户提供了几个引用链接,我需要先仔细查看这些引用的内容,看看哪些部分与Java反射机制相关。 首先,引用[1]提到了韩顺平的Java反射机制笔记,可能包含基础概念和应用场景。引用[3]详细说明了反射的功能,比如运行时判断类、构造对象、获取成员变量和方法,以及动态代理。这些信息应该整理出来,作为反射的核心能力。引用[5]提到了获取类构造器的方法,比如getConstructor,还有具体的代码示例,这部分是反射API的使用,需要详细说明。引用[4]讨论了反射的访问检查设置,参数true和false的作用,这对性能优化有帮助,应该包括进去。 接下来,我需要将这些信息按照逻辑结构组织起来。可能分为反射机制的作用、相关类、构造器获取示例以及性能优化注意事项。同时,用户要求生成相关问题,我需要考虑用户可能感兴趣的后续问题,比如反射的应用场景、优缺点、动态代理的实现等。 需要注意引用标注的正确性,每个要点后加上对应的引用标识。另外,回答要使用中文,保持结构清晰,分点说明。代码示例要使用正确的格式,并确保LaTeX语法正确,比如行内公式用$...$,独立公式用$$...$$,但在这个问题中可能不需要数学公式,所以主要关注代码块的格式。 最后,检查是否有遗漏的信息点,比如引用[2]和引用[5]中的其他内容是否相关。看起来引用[2]可能和反射无关,可以忽略。引用[5]中的类加载、final接口等内容可能属于其他主题,但用户的问题集中在反射上,所以重点处理与反射直接相关的部分。 总结回答的结构:反射机制的作用,相关类,构造器获取的代码示例,访问检查的性能优化,以及相关问题。确保每个部分都有对应的引用支持,并且语言简洁明了,帮助用户快速理解韩顺平笔记中的反射内容。</think>### 韩顺平笔记中关于Java反射机制的核心内容整理 #### 1. **反射机制的核心功能** 反射机制允许程序在**运行时**动态操作类和对象,具体功能包括: - 判断任意对象所属的类[^3] - 构造任意类的对象 - 获取任意类的成员变量和方法 - 调用任意对象的成员变量和方法 - 生成动态代理(如Spring框架的AOP实现) #### 2. **反射相关核心类** | 类名 | 作用描述 | |-------------------------------|---------------------------------| | `java.lang.Class` | 表示类的元数据,类加载后对应的堆对象 | | `java.lang.reflect.Method` | 表示类的方法 | | `java.lang.reflect.Field` | 表示类的成员变量 | | `java.lang.reflect.Constructor` | 表示类的构造方法 | #### 3. **构造器获取示例** 通过`Class`对象获取构造器的方法: ```java // 获取无参构造器 Constructor constructor = cls.getConstructor(); System.out.println(constructor); // 获取带String参数的构造器 Constructor constructor1 = cls.getConstructor(String.class); System.out.println(constructor1); ``` 此代码演示了如何通过反射获取类的不同构造方法[^5]。 #### 4. **性能优化注意事项** 通过`setAccessible(true)`可以关闭反射时的访问检查,提升反射效率: ```java // 关闭访问检查(适用于私有成员访问) field.setAccessible(true); ``` 参数`true`表示禁用访问检查,`false`表示启用(默认)[^4]。 --- ### §§ 相关问题 §§ 1. **反射机制的应用场景有哪些?** 答:常用于框架开发(如Spring IOC)、动态代理、注解处理器等需要运行时动态操作类的场景。 2. **反射的优缺点是什么?** 答:优点为灵活性高,缺点为性能开销大(需通过`setAccessible`优化)、破坏封装性[^3]。 3. **如何通过反射调用私有方法?** 答:需先调用`method.setAccessible(true)`关闭访问检查,再执行`method.invoke(obj)`。 4. **动态代理如何通过反射实现?** 答:使用`Proxy.newProxyInstance()`结合`InvocationHandler`接口,在运行时生成代理类并拦截方法调用[^3]。 --- 以上内容整理自韩顺平Java教程中关于反射机制的笔记,主要覆盖反射原理、核心API和实际应用[^1][^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值