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实现调用拦截器是不是有所了解了呢?
【编辑推荐】