利用java.lang.reflect包中的InvocationHandler、Proxy實現代理(攔截已有方法)



          本來想自己寫一個日志的,發現有位老兄寫的很好,我就不用費事,直接貼過來做筆記好了。
          ==========================================================

          [轉自: http://publishblog.blogdriver.com/blog/tb.b?diaryID=842351 ]

          [Java]使用Proxy和InvocationHandler實現代理器模式

          • 元對象(被代理對象):

          package com.zj.gof.proxy;

          public interface StudentInfoService {
          ?void findInfo(String studentName);
          }

          package com.zj.gof.proxy;

          public class StudentInfoServiceImpl implements StudentInfoService {
          ?public void findInfo(String name) {
          ??System.out.println("你目前輸入的名字是:" + name);
          ?}
          }

          • 代理對象:

          package com.zj.gof.proxy;

          import java.lang.reflect.InvocationHandler;
          import java.lang.reflect.Method;
          import java.lang.reflect.Proxy;

          import org.apache.log4j.Logger;

          public class LogHandler implements InvocationHandler {
          ? private Object proxyObj;
          ? private static Logger log=Logger.getLogger(LogHandler.class);
          ?
          ? public Object bind(Object obj){
          ?? this.proxyObj=obj;
          ?? return Proxy.newProxyInstance(obj.getClass().getClassLoader(),obj.getClass().getInterfaces(),this);
          ? }
          ?
          ? public Object invoke(Object proxy,Method method,Object[] args) throws Throwable{
          ?? Object result=null;
          ?? try{
          ??? //請在這里插入代碼,在方法前調用
          ??? log.info("調用log日志方法"+method.getName());
          ??? result=method.invoke(proxyObj,args); //原方法
          ??? //請在這里插入代碼,方法后調用
          ?? }catch(Exception e){
          ??? e.printStackTrace();
          ?? }
          ?? return result;
          ? }

          }

          注意:通過InvocationHandler接口實現的代理器只能代理接口方法. (這點在InvocationHandler的注解中有說明)

          • 代理工廠:

          package com.zj.gof.proxy;

          public class LogFactory {
          ?private static Object getClassInstance(String clzName) {
          ??Object obj = null;
          ??try {
          ???Class cls = Class.forName(clzName);
          ???obj = (Object) cls.newInstance();
          ??} catch (ClassNotFoundException cnfe) {
          ???System.out.println("ClassNotFoundException:" + cnfe.getMessage());
          ??} catch (Exception e) {
          ???e.printStackTrace();
          ??}
          ??return obj;
          ?}

          ?public static Object getAOPProxyedObject(String clzName) {
          ??Object proxy = null;
          ??LogHandler handler = new LogHandler();
          ??Object obj = getClassInstance(clzName);
          ??if (obj != null) {
          ???proxy = handler.bind(obj);
          ??} else {
          ???System.out.println("Can't get the proxyobj");
          ???//throw
          ??}
          ??return proxy;
          ?}

          }

          • 客戶端調用:

          package com.zj.gof.proxy;

          public class MainTest {

          ?public static void main(String[] args) {
          ??//??PropertyConfigurator.configure("d:/log4j.properties");
          ??BasicConfigurator.configure();
          ??StudentInfoService studentInfo = (StudentInfoService) LogFactory
          ????.getAOPProxyedObject("com.zj.gof.proxy.StudentInfoServiceImpl");
          ??studentInfo.findInfo("阿飛");
          ?}
          }

          • 運行結果:

          0 [main] INFO root? - 調用log日志方法findInfo
          你目前輸入的名字是:阿飛

          posted on 2007-09-18 17:45 心硯 閱讀(2681) 評論(0)  編輯  收藏 所屬分類: Java

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(2)

          隨筆分類

          文章分類

          文章檔案

          Forum

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 三穗县| 舞阳县| 都匀市| 凤山市| 恭城| 县级市| 大化| 西乌珠穆沁旗| 屏东县| 汪清县| 南京市| 仙游县| 偃师市| 额敏县| 东港市| 嘉义市| 湄潭县| 大姚县| 冷水江市| 万安县| 萍乡市| 磐石市| 恭城| 三穗县| 荣成市| 嘉兴市| 南投县| 阜南县| 山阳县| 诏安县| 凤冈县| 临猗县| 清远市| 娱乐| 沭阳县| 临武县| 十堰市| 平果县| 濮阳市| 鱼台县| 嵊泗县|