java 动态代理范例 InvocationHandler与Proxy,拦截与代理

来源:互联网 发布:库存sql和access的区别 编辑:程序博客网 时间:2024/05/16 17:23

java 动态代理范例 InvocationHandler与Proxy,拦截与代理 (转载)

JDK1.2以后提供了动态代理的支持,程序员通过实现java.lang.reflect.InvocationHandler接口提供一个拦截处理器,然后通过java.lang.reflect.Proxy得到一个代理对象,通过这个代理对象来执行商业方法,在商业方法被调用的同时,执行处理器会被自动调用。

Java动态代理只能对实现了接口的类生成代理,不能针对类。其实现主要是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口。Proxy类主要用来获取动态代理对象,InvocationHandler接口用来约束调用者实现。

接口类源代码:

Java代码
  1. publicinterface HelloWorld {
  2. publicvoid sayHelloWorld();
  3. }

实现类源代码:

Java代码
  1. publicclass HelloWorldImplimplements HelloWorld {
  2. publicvoid sayHelloWorld() {
  3. System.out.println("Hello World!");
  4. }
  5. }

拦截器源代码:

Java代码
  1. publicclass HelloWorldHandlerimplements InvocationHandler {
  2. //目标对象
  3. private Object targetObject;
  4. public HelloWorldHandler(Object targetObject){
  5. this.targetObject = targetObject;
  6. }
  7. public Object invoke(Object proxy, Method method, Object[] args)throws Throwable {
  8. System.out.println("方法调用前。。。");
  9. Object result = method.invoke(this.targetObject, args);
  10. System.out.println("方法调用结束");
  11. return result;
  12. }
  13. }

测试代码:

Java代码
  1. publicclass HelloWorldTest {
  2. publicstaticvoid main(String[] args) {
  3. //业务对象
  4. HelloWorld obj = new HelloWorldImpl();
  5. //拦截器对象
  6. HelloWorldHandler handler = new HelloWorldHandler(obj);
  7. //返回业务对象的代理对象
  8. HelloWorld proxy = (HelloWorld)Proxy.newProxyInstance(
  9. obj.getClass().getClassLoader(),
  10. obj.getClass().getInterfaces(),
  11. handler);
  12. //通过代理对象执行业务对象的方法
  13. proxy.sayHelloWorld();
  14. }
  15. }

测试结果:

Html代码
  1. 方法调用前。。。
  2. Hello World!
  3. 方法调用结束
原创粉丝点击