有没有可能让一个程序运行另一个程序(.java文件)的代码并自动调试每一行
例如,假设我希望有一个通用程序,它创建一个线程,从JFileChooser中指定的.java文件运行代码,并逐行或一直运行到某一行,然后打印调试器中的每个更改,或者至少打印一个类似的函数(即打印数据结构和变量内部的值). 写出来的时候,这听起来像是一个普通的IDE或者我自己运行调试就可以得到的东西,但是假设我想要一种更简单的调试方法,而不是自己完成每一步,查看调试器,向下滚动,展开我想检查的值,然后再向下滚动,等等。大多数情况下,当我调试时,我得到了很多我并不真正关心的信息,所以我只想限制所有变量中的值,而不是它的属性等等 这似乎是一个相当大的项目,或者可能不是,实际上很简单。不管怎样,我想创建一个项目。。。 1. 具有运行指定.java文件的代码的线程 二,。 一个在第一个线程中打印值更改的线程(为了方便起见,我可以使用一个GUI,让它更新每个值和步骤,即(字符串[]名称=>[],[“Joe Shmoe”],[“Joe Shmoe”,“Kyle Stanly”],[]等) 三,。 能够逐行阅读,或者至少能够记录正在发生的变化,这样我就可以回去查看 四,。 抛出任何要查看的错误,例如,另一个包含stacktrace的文本框有没有可能让一个程序运行另一个程序(.java文件)的代码并自动调试每一行,java,multithreading,debugging,Java,Multithreading,Debugging,例如,假设我希望有一个通用程序,它创建一个线程,从JFileChooser中指定的.java文件运行代码,并逐行或一直运行到某一行,然后打印调试器中的每个更改,或者至少打印一个类似的函数(即打印数据结构和变量内部的值). 写出来的时候,这听起来像是一个普通的IDE或者我自己运行调试就可以得到的东西,但是假设我想要一种更简单的调试方法,而不是自己完成每一步,查看调试器,向下滚动,展开我想检查的值,然后再向下滚动,等等。大多数情况下,当我调试时,我得到了很多我并不真正关心的信息,所以我只想限制所有
我想知道这是否可行,如果可行,从何处开始。如果我成功地做到了这一点,它将帮助我调试我尝试的任何未来项目。您无法调试.java文件。但是,您可以做的是编译这些文件并输出自定义诊断!诊断基本上是编译时获得的调试器输出。您的所有诊断都将存储在一个您甚至可以自己实现的数据库中(但您不必这样做) 你想了解的是这个实用程序。我认为Javadoc解释得很好,但是如果你发现它们不怎么样(就像我当年做的那样),你可以用谷歌搜索任何你不懂的东西。那里有很多例子和教程 这是我个人项目中的内容:
public boolean compile() {
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
try {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(classFiles);
compiler.getTask(null, fileManager, diagnostics, compileOptions, null, compilationUnits).call();
}
} catch (IOException ex) {
System.err.println("Compilation failed: " + ex.getMessage());
return false;
}
System.out.println("Compilation finished.");
// returns false if the diagnostics contain errors, and true if there are no
// diagnostics or if all the diagnostics are warnings.
return successfullCompilation(diagnostics.getDiagnostics());
}
公共布尔编译(){
DiagnosticCollector diagnostics=新建DiagnosticCollector();
试一试{
JavaCompiler=ToolProvider.getSystemJavaCompiler();
try(StandardJavaFileManager fileManager=compiler.getStandardFileManager(null,null,null)){
Iterable您无法调试.java文件。但是,您可以做的是编译这些文件并输出自定义诊断!诊断基本上是编译时获得的调试器输出。您所有的诊断都将存储在一个甚至可以自己实现的文件中(不过,您不必这样做) 你想了解的是这个实用程序。我认为Javadoc解释得很好,但是如果你发现它们不怎么样(就像我当年做的那样),你可以用谷歌搜索任何你不懂的东西。那里有很多例子和教程 这是我个人项目中的内容:
public boolean compile() {
DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<>();
try {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
try (StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null)) {
Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(classFiles);
compiler.getTask(null, fileManager, diagnostics, compileOptions, null, compilationUnits).call();
}
} catch (IOException ex) {
System.err.println("Compilation failed: " + ex.getMessage());
return false;
}
System.out.println("Compilation finished.");
// returns false if the diagnostics contain errors, and true if there are no
// diagnostics or if all the diagnostics are warnings.
return successfullCompilation(diagnostics.getDiagnostics());
}
公共布尔编译(){
DiagnosticCollector diagnostics=新建DiagnosticCollector();
试一试{
JavaCompiler=ToolProvider.getSystemJavaCompiler();
try(StandardJavaFileManager fileManager=compiler.getStandardFileManager(null,null,null)){
IterableWelcome to StackOverflow。由于您是新来的,请看一下帮助中心的“如何提出一个好问题:。我刚才确实回答了您的问题,但您应该学会如何使您的问题更易于理解和阅读(事实并非如此)。欢迎来到StackOverflow。由于您是新来的,请看一下帮助中心的“如何提出一个好问题:。我刚才确实回答了您的问题,但您应该学会如何使您的问题更易于理解和阅读(事实并非如此)。这实际上是…我非常需要的。我以后肯定会将javadocs与您的代码一起用作参考。但我有一个问题:虽然这会告诉您它是否编译良好,但如果它编译正确,是否有方法运行它?例如,这可以帮助我确定它是否编译正确,如果正确,则可以我运行它,是否有编译器存储的变量列表,以及这些引用中是否有我可以使用的值引用?@KyleStanly编译器自身生成的任何数据(即诊断)都可以在编译应用程序中访问。但是,如何访问和/或将数据发送到freshly编译的应用程序是一个完全不同的问题。这是
ClassLoader
和Reflection
潜伏的领域,超出了我的专业知识范围。我建议您接受这个答案,尝试编写一个可以成功编译类文件的应用程序,然后回到这里来StackOverflow并询问一个新的问题当你的任务摆在面前时,你会得到更多的帮助:)事实上,这正是我所需要的。我以后肯定会将javadocs与您的代码一起用作参考。但我有一个问题:虽然这会告诉您它是否编译良好,但如果它编译正确,是否有办法运行它?比如,这可以帮助我确定它是否编译正确,如果正确,则可以我运行它,是否有编译器存储的变量列表,以及这些引用中是否有我可以使用的值引用?@KyleStanly编译器本身生成的任何数据(即诊断)都可以在编译应用程序中访问。但是,如何访问和/或将数据发送到利康比