当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java入门

用Java Instrumentation 在类加载时添加记录

  在分析程序出错的原因时,了解它当时的状态将是非常有用的。在许多情况下,我们可以通过堆栈追踪实现此目的,但这些信息经常都是不可用的,或者您需要的可能是程序在出错时处理数据的相关信息。

  传统做法是使用 log4j 和 Java Logging API 等记录框架,然后再通过人工来编写和维护所需的记录语句。这种操作非常单调乏味且容易出错,一般适合自动实现。Java 5 添加的 Java Instrumentation 机制允许您通过提供 "Java 代理" 来检查和修改加载的类字节代码。

  本文将展示如何实现这种 Java 代理,它借助标准 Java Logging API 透明地对类中所有方法添加入口和出口记录。以 Hello World 为例:


 public class HelloWorld { 

            public static void main(String args[]) { 

                       System.out.println("Hello World"); 

           }

}

      下面是添加了入口和出口记录语句的同一个用例:


import java.util.Arrays;

import java.util.logging.Level;

import java.util.logging.Logger;

public class LoggingHelloWorld { 

        final static Logger _log = Logger.getLogger(LoggingHelloWorld.class.getName()); 

        public static void main(String args[]) { 

        if (_log.isLoggable(Level.INFO)) {

        _log.info("> main(args=" + Arrays.asList(args) + ")"); 

        } 

        System.out.println("Hello World"); 

        if (_log.isLoggable(Level.INFO)) { 

        _log.info("< main()"); 

          } 

     }

}

  默认记录程序生成的输出格式大体为:

  


2007-12-22 22:08:52 LoggingHelloWorld main

INFO: > main(args=[])

Hello World

2007-12-22 22:08:52 LoggingHelloWorld main

INFO: < main()

  可以看到,每个记录语句显示为两行:一行显示时间戳、提供的记录名称和生成调用的方法,另一行是提供的记录正文。

  本文的其余部分将演示如何通过操作加载的字节代码使原始的 Hello World 程序和有记录的 Hello World 程序有一致的行为效果。使用的操作机制是在 Java 5 中添加 Java Instrumentation。

共3页 首页 上一页 1 2 3 下一页 尾页 跳转到
相关内容
赞助商链接