现在的位置: 首页 > 综合 > 正文

JDK的动态代理实现调用拦截器中的方法

2012年04月23日 ⁄ 综合 ⁄ 共 1984字 ⁄ 字号 评论关闭

1.JDK能对实现了接口的实例来生成代理,因此首先创建一个接口.

//interface person
package cn.edu.hld;

public interface Person
{
public void info() ;
public void run() ;
}
2.为了在后面实现动态代理,因此提供一个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("我想跑得快一些!");
}
}
3.实现核心的拦截器类当某个方法被调用之前或之后执行相应的拦截器的方法.至于要拦截哪一个对象,则需通过后面的操作来体现.

//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被执行了!") ;
}
}
4.为了让拦截器知道其要拦截的目标对象,以及其应执行的方法,则应该创建一个类,该类实现一个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;
}
}
5.为了根据目标对象生成一个代理对象,还应该创建一个代理工厂.

//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) ;
}
}
6.主程序的实现.

//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() ;
}
}
7.直接在MyEclipse中运行.得到结果如下:

method_1被执行了!
我是thtwin
method_2被执行了!
我想跑得快一些!

96堆栈 软件编程网http://www.96dz.com,共享C、C++、Java、C# .NET等编程技术资源,视频教程

抱歉!评论已关闭.