使用Proxy和InvocationHandler实现代理器模式 实现spring aop

[转自: 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
你目前输入的名字是:阿飞

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值