A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 塞肥肥塞牙人 中级黑马   /  2014-9-11 17:20  /  768 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

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. }  
复制代码


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马