动态代理

本文介绍了一个使用Java动态代理实现的日志记录系统。通过创建LoggingProxy类作为InvocationHandler,并利用Proxy类生成代理对象,该系统能在调用方法前后记录日志信息。文章还展示了如何将此功能应用于Person接口的具体实现中。
摘要由CSDN通过智能技术生成

Effective.Enterprise

 

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.logging.Logger;

public class LoggingProxy implements InvocationHandler {

 private Logger logger;

 private Object proxiedObject;

 private LoggingProxy(Logger l, Object obj) {
  // TODO Auto-generated constructor stub
  logger = l;
  proxiedObject = obj;
 }

 public static Object newLoggingProxyAround(Logger logger, Object obj) {
  return Proxy.newProxyInstance(obj.getClass().getClassLoader(), obj
    .getClass().getInterfaces(), new LoggingProxy(logger, obj));
 }

 public Object invoke(Object proxy, Method m, Object[] args)
   throws Throwable {
  // TODO Auto-generated method stub
  Object result;
  try {
   logger.info("Entering method " + m.getName());
   result = m.invoke(proxiedObject, args);
  } catch (Exception x) {
   logger.warning("unexpected Exception " + x + " invoke "
     + m.getName());
   throw x;
  } finally {
   logger.info("Exiting mothod " + m.getName());
  }
  return result;
 }
}
//-----------


public interface Person {
 public String getFirstName();
 public void setFirstName(String value);
 
 public String getLastName();
 public void setLastName(String value);
 
 public int getAge();
 public void setAge(int value);
 
}
//--------------------


public class PersonImpl implements Person {
 
 private String firstName;
 private String lastName;
 private int age;
 
 public int getAge() {
  // TODO Auto-generated method stub
  return this.age;
 }

 public String getFirstName() {
  // TODO Auto-generated method stub
  return this.firstName;
 }

 public String getLastName() {
  // TODO Auto-generated method stub
  return this.lastName;
 }

 public void setAge(int value) {
  // TODO Auto-generated method stub
  this.age=value;
 }

 public void setFirstName(String value) {
  // TODO Auto-generated method stub
  this.firstName=value;
 }

 public void setLastName(String value) {
  // TODO Auto-generated method stub
  this.lastName=value;
  
 }

}

//------------

import java.util.logging.Logger;


public class PersonManager {

 public Logger personLogger= Logger.getLogger("Person", "a");
 public boolean loggerEnabled=false;
 /**
  * @param args
  */
 public Person getperson(String firstName, String lastName){
  Person p=new PersonImpl();
 
  if(loggerEnabled){
   p=(Person)LoggingProxy.newLoggingProxyAround(personLogger, p);
  }
  p.setFirstName(firstName);
  p.setLastName(lastName);
  return p;
 }
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  PersonManager pm=new PersonManager();
  pm.loggerEnabled=true;
  System.out.println("-----------");
  Person p=pm.getperson("firstName", "lastName");
//  System.out.println(p.getFirstName()+"."+p.getLastName());
  
 }

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值