JDK实现调用拦截器浅析

开发 后端
JDK实现调用拦截器是如何执行的呢?那么我们就在这篇文章里向你介绍JDK实现调用拦截器的情况。

JDK实现动态代理调用拦截器中的方法的过程是什么呢?

JDK实现调用拦截器之一:

实现接口的实例来生成代理,因此创建一个接口

interface person 

package cn.edu.hld;   
 
public interface Person   
{   
public void info() ;   
public void run() ;   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.

JDK实现调用拦截器之二:

提供一个Person接口的实现类.

类PersonImpl .java

package cn.edu.hld;   
 
public class PersonImpl implements Person   
{   
 
public void info()   
{   
// TODO Auto-generated method stub   
System.out.println("我是thtwin") ;   
 
}   
public void run()   
{   
// TODO Auto-generated method stub   
System.out.println("我想跑得快一些!");   
}   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.


JDK实现调用拦截器之三:

实现核心的拦截器类当某个方法被JDK调用之前或之后执行相应的拦截器的方法.至于要拦截哪一个对象,则需通过后面的操作来体现.

PersonIntercepter.java

package cn.edu.hld;   
 
public class PersonIntercepter   
{   
public void method1()   
{   
System.out.println("method_1被执行了!") ;   
}   
public void method2()   
{   
System.out.println("method_2被执行了!") ;   
}   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.


JDK实现调用拦截器之四:

为了让拦截器知道其要拦截的目标对象,以及其应执行的方法,则应该创建一个类,该类实现一个JDK反射体系里的接口InvocationHandler.

ProxyHandler .java

package cn.edu.hld;   
 
import java.lang.reflect.InvocationHandler;   
import java.lang.reflect.Method;   
 
public class ProxyHandler implements InvocationHandler   
{   
private Object target ;   
private PersonIntercepter pi = new PersonIntercepter() ;   
public Object invoke(Object proxy, Method method, Object[] args)   
throws Throwable   
{   
Object result = null ;   
if(method.getName().equals("info"))   
{   
pi.method1() ;   
result = method.invoke(target, args) ;   
pi.method2() ;   
}   
else   
{   
result = method.invoke(target, args) ;   
}   
return result;   
}   
public void setTarget(Object target)   
{   
this.target = target;   
}   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.


JDK实现调用拦截器之五:

为了根据目标对象生成一个代理对象,还应该创建一个代理工厂.

MyProxyFactory.java

package cn.edu.hld;   
 
import java.lang.reflect.Proxy;   
 
public class MyProxyFactory   
{   
public static Object getProxy(Object target)   
{   
ProxyHandler handler = new ProxyHandler() ;   
handler.setTarget(target) ;   
return Proxy.newProxyInstance(PersonImpl.class.getClassLoader()   
,target.getClass().getInterfaces(),handler) ;   
}   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.


JDK实现调用拦截器之六:

主程序的实现.

TestPerson.java

package cn.edu.hld;   
 
public class TestPerson   
{   
public static void main(String args[])   
{   
Person targetPerson = new PersonImpl() ;   
Person person = null ;   
Object proxy = MyProxyFactory.getProxy(targetPerson) ;   
if(proxy instanceof Person)   
{   
person = (Person)proxy ;   
}   
person.info() ;   
person.run() ;   
}   
}  
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.


JDK实现调用拦截器之七:

直接在MyEclipse中运行.得到结果如下:

method_1被执行了!   
我是thtwin   
method_2被执行了!   
我想跑得快一些! 
  • 1.
  • 2.
  • 3.
  • 4.

JDK实现调用拦截器的基本框架和方法就介绍完了,那么现在你对JDK实现调用拦截器是不是有所了解了呢?

【编辑推荐】

  1. JDK1.6的十大技术浅谈
  2. 安装JDK后JRE与JVM联系浅谈
  3. JDK源码Java.lang.Boolean的浅析
  4. Linux安装JDK与VI编辑器操作浅析
  5. JDK源码分析之Set类详解
责任编辑:仲衡 来源: 中国网管联盟
相关推荐

2011-11-21 14:21:26

SpringMVCJava框架

2009-06-24 16:00:00

2009-09-27 17:37:32

Hibernate拦截

2025-02-28 08:14:53

2025-01-02 10:10:51

2009-06-25 15:59:21

Struts2教程拦截器

2023-03-10 19:36:47

2023-09-05 08:58:07

2011-05-16 10:14:11

Hibernate

2009-02-04 14:45:06

2009-06-04 08:01:25

Struts2拦截器原理

2024-05-06 00:00:00

C#工具代码

2020-03-25 17:55:30

SpringBoot拦截器Java

2009-06-25 15:54:42

Struts2教程拦截器

2012-02-03 13:27:16

2009-07-07 15:53:02

JDK日志

2024-02-28 09:35:52

2009-02-04 14:19:38

2013-11-04 09:35:38

Firefox插件拦截FLASH

2009-09-04 09:27:48

C#调用浏览器
点赞
收藏

51CTO技术栈公众号