问题标签 [java-compiler-api]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
172 浏览

java - 命名空间如何在 ant 构建文件中工作?

我正在尝试使用 ant-contrib 并且我注意到有时它用于指定 ac: 命名空间,有时则不是。

我什么时候应该使用命名空间,为什么?

0 投票
2 回答
904 浏览

java - 使用 JavaCompiler 包在另一个 Java 类中获取编译 Java 源文件的结果

我的类中有以下(简化的)代码,它调用 Java 编译器来处理给定的源文件:

编译成功,但是现在我如何才能得到 MyClass.java 的结果,如何运行这个编译的代码。

0 投票
1 回答
512 浏览

java - CompilationTask.call() 引入了 ClassNotFoundException。在JDK6中工作,而不是在JDK7中

从 JDK6 迁移到 JDK7 后,下一个代码失败并出现ClassNotFoundException

解决方法:

有谁知道为什么在调用 task.call() 类之后找不到了?编译任务似乎以某种方式更改了系统类加载器?

0 投票
0 回答
227 浏览

java - 如何在 Java Compiler API 中将 Trees.isAccessible() 用于原始数据类型/如何将 TypeMirror 转换为 DeclaredType

我正在尝试使用 Java Compiler API 分析 .java 文件。我当前的问题是找出给定变量、方法或类是否在程序的特定范围内已知(范围是指在 Java Compiler API 本身中定义的范围,请参见此处:http:// docs.oracle.com/javase/6/docs/jdk/api/javac/tree/com/sun/source/tree/Scope.html)。

Java 编译器 API ( http://docs.oracle.com/javase/6/docs/jdk/api/javac/tree/com/sun/source/util/Trees.html )的 Trees 类有一个实用方法来这样做:是可访问的。如果目标节点在给定范围内已知,则此方法获取 Scope 和目标节点及其声明的类型并返回 true。

不幸的是,我不知道如何创建这个 DeclaredType 对象(从现在开始,我只能编写类名并且不再发布超链接,因为 stackoverflows 垃圾邮件预防:javax.lang.model.type.DeclaredType)。我可以询问目标节点的类型(javax.lang.model.element.Element [asType()-method]),但它返回的是 TypeMirror 实例,而不是 DeclaredType。

目前我使用这两行代码:

其中“referenceCompTree”是当前程序的树实例,referenceScope 是有问题的 Scope,nodeElement 是有问题的节点和 nodeType ...嗯,应该是有问题的节点的 DeclaredType。

这种直接类型转换方法适用于一种情况,即类的节点(我认为这是有效的,因为节点声明了自己的类型,因此它的 typeMirror 等效于它自己的类型)。但它绝对不适用于原始类型的变量(如标题中所述),我不确定它是否适用于变量。

有没有人知道

  1. 如何将 Trees 的 isAccessible 方法用于原始类型,或者更具体地说:如何将 TypeMirror 实例转换为 DeclaredType 实例?或者
  2. 如何在不使用 isAccessible 的情况下获取我想要的信息(如果变量、类或方法在给定范围内已知)?

附录:

我确实对这两个问题进行了进一步的研究,并想向您介绍我发现的一些事情:

  1. 有一个名为 Types (javax.lang.model.util.Types) 的实用程序类。可以使用标准 Java Compiler API 类(在本例中为:com.sun.source.util.JavaTask)获取类型的实例。此对象有一个方法 (getDeclaredType),它返回给定 TypeElement 和一些 TypeMirror 的 DeclaredType 实例。但是这个方法对我也不起作用,因为它会抛出一个错误,指出我以前很少输入参数。我想这个方法的唯一目的是为给定的原始类和一些类型参数返回一个 DeclaredType 实例(例如,要为 HashMap 创建 DeclaredType 实例,您可以将此方法与用于 HashMap 的 typeElement 和用于 String 的两个 typeMirror 一起使用)。显然这不是我打算做的。
  2. 我试图通过查找变量、类或方法在给定范围内是否已知变量、类或方法来编写解决方法,方法是查找其各自的修饰符并搜索范围树,但我不相信这种方法,主要原因有两个:不确定我是否在我的搜索算法中正确地获得了 Java 范围构造的所有特殊情况,其次这似乎非常不必要,因为我试图重新实现一些(似乎)已经存在并且 Java 编译器一直在执行的东西。天啊,即使是我的 NetBeans 也一直告诉我给定的变量、方法或类是否在我当前的范围内是已知的。所以必须有办法。
0 投票
1 回答
570 浏览

java - InvocationTargetException,如何从此异常中提取带有消息的导致异常

从其他 Java 程序运行此语句时。

我得到了这个例外

我只是为了显示SecurityException由 JVM 给出的消息和行号(突出显示的文本上方)引起的异常。

我正在开发一个用于在 Web 上编译和执行程序的应用程序。

谢谢!!

0 投票
1 回答
797 浏览

java - 无法找到或加载主类 - 在异常情况下

好吧,我知道这是一个非常常见、非常简单的问题,但我的问题却很不寻常。(我无法在互联网上的其他地方找到解决方案的情况。)所以,我有一些源代码,我正在通过JavaCompiler. 然后我尝试使用 Runtime 执行编译后的代码。(也就是说,Runtime.getRuntime().exec(String[])。)但是,当我尝试执行所述代码时,我得到Could not find or load main class.了有问题的源代码遵循这个基本模型:

甚至该代码也不会执行。我仍然得到同样的错误。在此先感谢您的帮助。:)

*编辑:我详细采取的步骤如下:

  1. 我从名为 code 的 String 中的上述代码开始。然后我创建一个 File 对象(在本例中为 Compiled.java。)

  2. 我使用我已经测试过的自定义方法,并确保它可以编译文件(并且可以选择从中获取 Class 对象,但由于特定原因,我不能这样做。)成.class 文件。(使用JavaCompilerAPI。)

  3. 然后我用Runtime.getRuntime.exec(new String[]{"java",[location of .class file]});它来执行它。

正是在这一点上,我得到了一个错误。

根据要求,我正在使用的确切代码是这个..

第 3 行中的字符串操作有点混乱,但我已经三重检查以确保它有效 - 它确实有效。如果您想查看 . toClass()比特,去这里

0 投票
2 回答
178 浏览

java - 在另一个java代码中编译一个字符串中可用的java代码

可能重复:
Java 5 和 Java 6 的动态内存中 Java 代码编译 使用
Java 文件中的代码编译 Java 文件

我在程序的字符串中有一个 hello world 类可用,如下例所示,

}

有人可以帮助在上面给出的示例中可用的内存字符串中编译代码吗

0 投票
2 回答
736 浏览

javascript - 如何在客户端的网页中访问服务器端终端?

终端仿真器必须嵌入网页中,用户必须在网页中编译和运行通过网页访问在服务器上创建的 java 程序。我想在终端中编译和运行程序。客户端无需安装任何应用软件。

0 投票
1 回答
717 浏览

java - 清除java中通过class.forName加载的类

我创建了加载用户选择的 java(JPanel) 文件的程序。用户基本上选择了一个由 JavaCompiler 编译的 Java 文件,然后加载下一个生成的类文件。但是,当通过一些文本编辑器对 java 文件(JPanel)进行任何更改时,问题就来了,因为即使在关闭程序并重新运行项目之后,任何新的更改都不会反映在类文件中。

我认为同一个类文件会一次又一次地从内存中加载。

有没有办法从内存中清除加载的类?

汇编:

加载:

panel= (JPanel) cls.newInstance();

我已经用反编译器检查了编译的类文件,它已经更新了代码,但我不知道为什么以前的类文件是由类加载器从内存中加载的。

0 投票
3 回答
8082 浏览

java - 带有源代码操作的 Java 注释处理

我一直在寻找以下要求的解决方案 -

  • 源文件是在方法上使用自定义注释编写的
  • 方法主体需要根据注释进行一些变化。
  • 源文件不应更改,但编译器的输入应修改源文件

我查看了以下 API -

  • javax.annotation.processing - 注释处理。
  • javax.lang.model.* - 用于注释处理和编译器树 API 的语言模型
  • com.sun.source.* - 编译器树 API。

我想通过以下方式设计这个:

  1. 编写注释处理器
  2. 生成编译器树
  3. 在运行时编辑编译器树而不影响原始源文件
  4. 将树提供给编译器

编译器树 API 似乎很有希望,它可以访问 com.sun.source.tree.MethodTree

但是编译器树 API 似乎是只读的。我不知道如何完成步骤 3 和 4

有没有我可以采用的 API 来完成任务

注意:我只寻找源代码操作技术。无运行时字节码操作/AOP

环境:Java 6