gpt4 book ai didi

java - 编译了一个类,但是它在哪里?

转载 作者:行者123 更新时间:2023-11-30 04:58:19 27 4
gpt4 key购买 nike

我不是 Java 专家,而且我对编译和运行动态生成代码的整个概念还很陌生,这在其他语言中非常简单,特别是像 Javascript 和 PHP 这样的脚本语言。

我正在关注这段代码: http://www.java2s.com/Code/Java/JDK-6/CompilingfromMemory.htm我做了这样的事情:

private final String = "GeneratedClass_" + Long.toHexString(random.nextLong());
private Method compileCode(String code) {
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
if (compiler == null) return null;

DiagnosticCollector<JavaFileObject> diagnostics = new DiagnosticCollector<JavaFileObject>();

JavaFileObject source = new JavaSource(className, code);
Iterable<? extends JavaFileObject> compilationUnits = Arrays.asList(source);
CompilationTask task = compiler.getTask(null, null, diagnostics, null, null, compilationUnits);

if (!task.call()) return null;
try {
return Class.forName(className).getDeclaredMethods()[0];
} catch (ClassNotFoundException e) {}
return null;
}

private class JavaSource extends SimpleJavaFileObject {
final String code;
JavaSource(String name, String code) {
super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension),Kind.SOURCE);
this.code = code;
}

@Override
public CharSequence getCharContent(boolean ignoreEncodingErrors) {return code;}
}

想象一下字符串代码是这样的

"public class GeneratedClass_65ce701239c32ce0 {
public String hello() {
return "Hello, world!";
}
}"

它运行良好,直到 Class.forName 抛出 ClassNotFoundException。我很困惑,因为我似乎没有从代码片段中删除一些重要的内容:所以,该类已编译,但它去了哪里?

我读过一些关于使用不同的类加载器的内容,但是,正如我所说,我对所有这些东西都很陌生,我不知道该去哪里以及如何使用它,以及我应该如何定义自己的类加载器类加载器的扩展。我唯一知道的是,一切对我来说似乎都很复杂......

在 Windows 7 和 JDK 1.7 中使用 Eclipse Indigo。

最佳答案

您删除的一件重要的事情是所有错误输出和诊断信息。你永远不知道是否出了问题。然而,一切看起来都是正确的。您的问题很可能只是您没有向编译器发送任何选项,因此它会将类文件写入任何它感觉像的地方(我相信当前工作目录是默认目录),而这可能不在您的目录中类路径,尤其是在 IDE 中。尝试从命令行运行它,向自己证明它是有效的。这应该有效:

mkdir tmp
javac -d tmp <path your main class .java file>
java -cp .;tmp <your main class name>

如果您不熟悉命令行工具,javac 的参数必须是 .java 文件的文件系统路径,并且 java 的参数必须是code> 需要是 . 分隔的完全限定类名,例如 com.foo.Main。这样做应该:

  1. 将您的类编译到 tmp 目录。
  2. 将动态生成的类写入当前目录。
  3. 成功从当前目录加载新编译的类,因为它位于类路径中。

关于java - 编译了一个类,但是它在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7781160/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com