黑马程序员技术交流社区

标题: 分享关于动态代理的总结 [打印本页]

作者: 塞肥肥塞牙人    时间: 2014-9-11 17:20
标题: 分享关于动态代理的总结
InvocationHandler接口
  1. public interface InvocationHandler{  
  2.     public Object invoke(Object proxy,Method method,Object[] args)throws Throwable  
  3. }  
复制代码

参数说明:

Object  proxy:被代理的对象

Method  method:要调用的方法

Object   args[]:方法调用时所需要的参数


Proxy类

Proxy类是专门完成代理的操作类,可以通过此类为一个或多个接口动态地生成实现类,此类提供了如下的操作方法:

  1. public static Object newProxyInstance(ClassLoader loader,  
  2.             Class<?>[] interfaces,  
  3.             InvocationHandler h)  
  4.             throws IllegalArgumentException  
复制代码

参数说明:

ClassLoader  loader:类加载器

Class<?>[]  interfaces:得到全部的接口

InvocationHandler  h:得到InvocationHandler接口的子类实例

动态代理:

  1. package com.itmyhome;  
  2.   
  3. import java.lang.reflect.InvocationHandler;  
  4. import java.lang.reflect.Method;  
  5. import java.lang.reflect.Proxy;  
  6.   
  7. interface IHello{    //定义接口  
  8.     public void sayHello();  
  9. }  
  10. class HelloImpl implements IHello{  
  11.   
  12.     @Override  
  13.     public void sayHello() {  
  14.         // TODO Auto-generated method stub  
  15.         System.out.println("hello itmyhome");  
  16.     }  
  17. }  
  18. class MyInvocationHandler implements InvocationHandler{  
  19.   
  20.     private Object obj;   //真实主题类  
  21.     public Object bind(Object obj){  
  22.         this.obj = obj;  
  23.         return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj.getClass().getInterfaces(), this);  
  24.     }  
  25.     @Override  
  26.     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {  
  27.         System.out.println("***before***");  
  28.         Object temp = method.invoke(obj, args);  
  29.         System.out.println("***after***");  
  30.         return temp;  
  31.     }  
  32. }  
  33.   
  34. public class T {  
  35.     public static void main(String[] args) throws Exception{  
  36.         IHello h = (IHello)new MyInvocationHandler().bind(new HelloImpl());  
  37.         h.sayHello();  
  38.     }  
  39. }  
复制代码







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2