• 日志代理(记录日志)


    没有代理的情况:
    定义一个接口
    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");
     
  • 相关阅读:
    Partial Class —— 转发
    HTTP Message Handlers in ASP.NET Web API & HttpClient Message Handlers in ASP.NET Web API (转发)
    egg.js sequelize 事务处理
    (sequelize)bulkCreate函数中的updateOnDuplicate参数使用
    Sequelize 关联查询数据合并字段
    Vue获取钉钉免登陆授权码
    Microsoft太小气了,Wallop的帐号竟然被取消了。
    plot_importance多分类、排序不匹配、图片数值不显示
    Markdown常用语法说明
    UIS8910的引脚复用
  • 原文地址:https://www.cnblogs.com/doudingbest/p/4900341.html
Copyright © 2020-2023  润新知