利用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

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 德清县| 贵港市| 宁晋县| 南丰县| 萝北县| 罗山县| 隆子县| 三河市| 舞阳县| 青海省| 巨鹿县| 平远县| 新晃| 崇礼县| 即墨市| 新宁县| 宣恩县| 阳春市| 桂林市| 遂平县| 静安区| 托克逊县| 达拉特旗| 凤山市| 岑溪市| 辽宁省| 墨江| 临颍县| 镇坪县| 柘荣县| 古浪县| 罗江县| 松原市| 公安县| 镇巴县| 巴彦淖尔市| 富平县| 苗栗市| 泊头市| 商都县| 西乌珠穆沁旗|