zoukankan      html  css  js  c++  java
  • 日志代理(记录日志)

    没有代理的情况:
    定义一个接口
    public interface UserDao {
    public void delete(String name);
    }
    定义一个实现类
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class UserDaoImpl implements UserDao {

    public void delete(String name) {
    Logger logger = Logger.getLogger(this.getClass().getName()); //记录当前类的日志
    logger.log(Level.INFO, "before delete"); 
    System.out.println("删除成功!");
    logger.log(Level.INFO, "after delete");
    }
    }
    进行测试
    public class Tester {
    public static void main(String[] args) {
    UserDao dao = new UserDaoImpl();
    dao.delete("Lucy");
    }
    }
    测试结果为:
    三月 25, 2015 8:54:25 下午 com.log.UserDaoImpl delete
    信息: before delete
    删除成功!
    三月 25, 2015 8:54:25 下午 com.log.UserDaoImpl delete
    信息: after delete
     
    静态代理
    实现类
    public class UserDaoImpl implements UserDao {
    public void delete(String name) {
    }
    }
    代理类
    import java.util.logging.Level;
    import java.util.logging.Logger;
    public class StaticProxy implements UserDao {
    private UserDao dao;
    StaticProxy(UserDao dao){
    this.dao = dao;
    }
    Logger logger = Logger.getLogger(this.getClass().getName()); //记录当前类的日志
    public void delete(String name) {
    logger.log(Level.INFO, "before delete"); 
    dao.delete(name);
    logger.log(Level.INFO, "after delete");
    }
    验证
    public class Tester {
    public static void main(String[] args) {
    UserDao dao = new StaticProxy(new UserDaoImpl());
    dao.delete("Lucy");
    }
    }
    动态代理
    代理类
    import java.lang.reflect.InvocationHandler;
    import java.lang.reflect.Method;
    import java.lang.reflect.Proxy;
    import java.util.logging.Level;
    import java.util.logging.Logger;

    public class DynamicProxy implements InvocationHandler{
    Object delegate;
    Logger logger = Logger.getLogger(this.getClass().getName()); //记录当前类的日志
    public Object bind(Object delegete){
    this.delegate = delegete;
    Class cls = delegate.getClass();
    return Proxy.newProxyInstance(cls.getClassLoader(),
    cls.getInterfaces(), this);
    }
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    System.out.println("Proxy:"+proxy.getClass().getName());
    System.out.println("method:"+method.getName());
    if(args.length>0){
    System.out.println(args);
    }
    Object obj = method.invoke(delegate, args);
    String log = "方法"+method.getName()+"被"+args[0]+"执行";
    logger.log(Level.INFO, log);
    return obj;
    }
    测试类中main的内容
    UserDao dao = (UserDao)new DynamicProxy().bind(new UserDaoImpl());
    dao.delete("Lucy");
     
  • 相关阅读:
    pc 端支付宝支付流程
    crontab
    Java集合之HashSet
    Java内存与垃圾收集知识总结
    Volley设计思想和流程分析
    java内部类
    HandlerThread源码分析
    IntentService源码分析
    Android消息机制:Looper,MessageQueue,Message与handler
    LeetCode340 Longest Substring with At Most K Distinct Characters
  • 原文地址:https://www.cnblogs.com/doudingbest/p/4900341.html
Copyright © 2011-2022 走看看