<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

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲黄片手机免费观看| 久久亚洲精品无码VA大香大香| 免费观看AV片在线播放| 久久电影网午夜鲁丝片免费| 免费在线精品视频| 亚洲欧洲在线观看| 亚洲av日韩av永久在线观看| 三级毛片在线免费观看| 最近高清中文字幕无吗免费看| 九月婷婷亚洲综合在线| 亚洲三级电影网址| 免费无码又爽又刺激高潮视频| 四虎成人免费影院网址| 亚洲色婷婷六月亚洲婷婷6月| 亚洲三级在线免费观看| 99久久国产精品免费一区二区| 免费观看AV片在线播放| 亚洲精品天堂成人片AV在线播放| 午夜不卡久久精品无码免费| 亚洲AV日韩精品一区二区三区| 人禽伦免费交视频播放| 性一交一乱一视频免费看| 亚洲av无码成人影院一区| 亚洲高清国产拍精品青青草原| 亚洲熟女www一区二区三区| 久久免费看少妇高潮V片特黄| 亚洲综合色成在线播放| 最新亚洲卡一卡二卡三新区| 日本免费在线观看| youjizz亚洲| 亚洲乱码国产一区网址| 一级成人毛片免费观看| 好吊妞在线成人免费| 一级做a爰片久久毛片免费陪 | 国产免费黄色大片| 亚洲av无码不卡久久| 哒哒哒免费视频观看在线www| 十八禁视频在线观看免费无码无遮挡骂过 | A国产一区二区免费入口| 亚洲а∨天堂久久精品| 在线免费观看h片|