<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    利用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 心硯 閱讀(2674) 評論(0)  編輯  收藏 所屬分類: Java

    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    常用鏈接

    留言簿(2)

    隨筆分類

    文章分類

    文章檔案

    Forum

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 三年片在线观看免费大全| **一级毛片免费完整视| 免费人成又黄又爽的视频在线电影| 国产AV无码专区亚洲AV麻豆丫| 一区二区三区在线观看免费| 中文字幕高清免费不卡视频| 99久热只有精品视频免费看| 成年免费大片黄在线观看岛国| 亚洲美女精品视频| 无码天堂va亚洲va在线va| 精品国产一区二区三区免费看| 亚洲国产成人久久综合野外| 亚洲av日韩av无码| 久久精品国产亚洲AV未满十八| 精品久久久久久久免费加勒比| 亚洲国产AV一区二区三区四区| www成人免费观看网站| 亚洲欧洲久久av| 亚洲老熟女五十路老熟女bbw| APP在线免费观看视频| 成人毛片视频免费网站观看| 久久被窝电影亚洲爽爽爽| 亚洲熟妇久久精品| 67194成手机免费观看| 亚洲AV无码乱码在线观看代蜜桃| 一级做a爰全过程免费视频毛片| 中文字幕亚洲不卡在线亚瑟| 亚洲免费福利在线视频| 精品国产sm捆绑最大网免费站| 亚洲综合最新无码专区| 亚洲国产成人综合精品| 亚洲国产香蕉人人爽成AV片久久| 免费观看一区二区三区| 亚洲一区在线免费观看| 亚洲国产成人五月综合网| 精品国产污污免费网站| 亚洲一级黄色视频| 国产成人精品免费视频大全麻豆| 在线观看亚洲视频| 岛国av无码免费无禁网站| 亚洲中字慕日产2021|