使用System.out.println语句插入java源文件?
我正在寻找一种简单的方法(例如,一个脚本/批处理文件或一个简单的程序)来插入一组Java源文件,以便每个方法在入口和出口都有一个添加的System.out.println语句 我找不到这样的实用工具。我需要它的原因(以及它必须处理源文件而不是.class文件的原因)是目标系统是嵌入式Java系统 提前感谢,,使用System.out.println语句插入java源文件?,java,debugging,Java,Debugging,我正在寻找一种简单的方法(例如,一个脚本/批处理文件或一个简单的程序)来插入一组Java源文件,以便每个方法在入口和出口都有一个添加的System.out.println语句 我找不到这样的实用工具。我需要它的原因(以及它必须处理源文件而不是.class文件的原因)是目标系统是嵌入式Java系统 提前感谢,, pd您可能没有找到太多,因为使用System.out对应用程序进行检测是一种非常可怕的方法 您想做什么-分析性能、代码覆盖率等?如果是这样的话,这两者都有很多工具 这是一个非常好的使
pd您可能没有找到太多,因为使用
System.out
对应用程序进行检测是一种非常可怕的方法
您想做什么-分析性能、代码覆盖率等?如果是这样的话,这两者都有很多工具
这是我多年来在嵌入式平台上使用java旧版本所学到的一些手动调试技巧。我同意Kees的观点,您应该使用面向方面的编程来自动将日志添加到每个函数中。我使用以下代码执行类似的计时操作:
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.util.StopWatch;
@Aspect
public class ProfilingAspect {
@Around("methodsToBeProfiled()")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
StopWatch sw = new StopWatch(pjp.getSignature().getClass().getSimpleName());
try {
sw.start(pjp.getSignature().getName());
return pjp.proceed();
} finally {
sw.stop();
LogFactory.getLog(pjp.getSignature().getClass()).debug(sw.shortSummary());
}
}
@Pointcut("execution(public * *.*(..))")
public void methodsToBeProfiled(){}
}
这几乎是您可以添加的最简单的方面。关键部分是切入点注释,它声明您希望将此方面应用于每个包中每个公共类的每个公共方法,无论其返回类型或输入参数如何。你可能想说得更具体些。@Around注释引用了切入点,并指定了一组您希望“围绕”函数执行的代码。在您的情况下,如果您只想在被调用的函数上进行日志记录,则可以根据您希望日志记录的位置,将@Around替换为@Before或@AfterReturning。如果您正在进行应用程序的所有构建,那么将目标定为“编译时编织”,而不是加载时。它降低了应用程序的运行时要求。我已经为slf4j编写了一个扩展,它提供了您正在寻找的功能(除了作为记录器调用而不是System.out,但是向System.out发送记录器调用很简单)
看一看我正在尝试对一个棘手的bug进行第一阶段分析-首先获取覆盖率信息,然后在相关位置添加更多打印输出,以查看其中的结果。我应该提到的是,我目前无法使用调试器单步执行代码(系统的调试支持暂时中断),因此必须依赖打印输出。我很清楚这是一种可怕的方法,但我还是想尝试一下。在这种情况下,也许您可以在每次方法调用时使用某种AOP来交织建议,以便在之前/之后打印语句?不确定这是否是嵌入式设备的一个选项。在这种情况下,您仍然应该查看log4j,而不是System.out.println()。不会帮助您自动插入,但一旦这些行出现,您将获得更多的控制权。。。与日志(log4j)一起使用,而不是使用“System.out.println”