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

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等编程技术资源,视频教程

转载于:https://www.cnblogs.com/Javalove/archive/2011/03/02/1969149.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值