问题标签 [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.
java - Annotation Processor - How to get the Class it is processing
I am trying to write a custom Anntoation processor. The annotation processor will process each class file at compile time to check annotations, But how am i able to get the class that it is currently processing? I am only able to get the class name in the following codes.
java - 从字符串编译 Java 代码会导致 ClassNotFoundException
我正在尝试使用 javax.tools 编译字符串中的代码的代码示例。Class.forName 导致 ClassNotFoundException。有人知道为什么吗?我正在使用 Java 7。
java - 使用 Compiler API 编译 Java 项目
我正在尝试使用 Compiler API 动态编译整个 java 项目。我最初的想法是首先知道如何使用命令行在一行中编译它,然后在编译器对象上应用相同的原理/参数。问题是,我从来没有,错误,使用 CLI 编译。(使用IDE的坏处?哈哈)
那么,我在正确的轨道上吗?再者,项目编译能不能做到一行执行?我很难弄清楚这一点,因为它是一个项目,它包含大量的包。
java - 是否可以使用 JRE 作为标准 VM 来实例化 Java 编译器?
我正在尝试使用反射动态编译和加载java类。如果我使用 JDK 作为标准 VM,我的代码可以正常工作,没有任何异常。ToolProvider.getSystemJavaCompiler()
但是当我将 JRE 用作标准 VM 时,相同的代码会引发空指针异常。
我的类路径中不能有 JDK。那么,我们是否可以选择使用 JRE 作为标准 VM 来编译 java 代码?谁能帮我解决这个问题?提前致谢。
annotation-processing - 编译器 API + 注释处理 == 双诊断消息?
我将 Java Compiler API (JSR199) 与自定义注释处理器 (JSR269) 结合起来。提供给编译器的 Java 源代码中的一些语法错误会导致诊断消息出现两次。许多语法错误仍然只会导致一条诊断消息。例如,不匹配的大括号只会产生一条消息,但带有无效限定标识符的导入会产生两条诊断消息,但仅在使用注释处理器时。
以下是一些会导致问题的示例输入:
对于注释处理器,我有以下内容。(我尝试过从进程返回 false 并且我也尝试过手动实现处理器而不是扩展 AbstractProcessor。)
下面是一些用于调用编译器和添加注释处理器的代码。
我的输出看起来像:
如果我取出processors.add(ap);
线路,那么重复的错误消息就会消失。添加多个处理器没有额外的影响。
知道为什么注释处理器在使用编译器 API 时会导致重复的诊断消息吗?(并且仅针对某些语法错误)
java - 词法分析只给出一个输出?
我测试了这个例子(lex.java),但它只给了我一个输出。
我作为读者给出了这篇文章:
nextToken ()函数是:
isdie主要方法:
System.out.println(lexeObject.nextToken());
输出是:
标识
为什么?但文本文件包含多个关键字?有谁知道是什么问题?
java - 编译器未调用自定义 JavaFileManager 的 getJavaFileForOutput(...) 方法
我有一个看起来像这样的自定义 JavaFileManager:
为了便于阅读,我编辑了很多代码;该类还实现了 list(...) 方法和 inferBinaryName(...) 方法。
在我项目的另一个领域,我运行类似于以下内容的内容:
如果我在 windows/mac/linux 上的 eclipse 中运行一些 junit 测试,它的工作原理完全符合我的预期。如果我在 windows 上的 glassfish 中运行我的项目,它也完全符合我的预期。如果我在 Mac OS X Mavericks 或 Centos 6.4 上的 glassfish 中运行相同的项目,getJavaFileForOutput(...) 根本就不会被调用!我的文件管理器的 getClassLoader(...) 方法最终被调用,但到那时为时已晚。
阻止调用我的 getJavaFileForOuput 方法的 linux+glassfish 环境有什么独特之处?
我很确定我已正确设置所有环境以使用相同的 jdk 版本:jdk1.7.0_45。
有什么建议吗??
java - 使用 javac 和 javax.tools.JavaCompiler 有什么区别?
Maven 编译器插件文档状态:
Compiler Plugin 用于编译项目的源代码。从 3.0 开始,默认编译器是 javax.tools.JavaCompiler(如果您使用的是 java 1.6),用于编译 Java 源代码。如果要强制使用 javac 插件,则必须配置插件选项
forceJavacCompilerUse
事实上,当forceJavacCompilerUse
我们的构建中没有指定时,会有一些构建错误,例如当代码引用com.sun.
包时(遗留,我们知道这是一个坏主意......)
这两种编译模式一般与 Maven 之间有什么其他区别?是否有任何应该知道的输出差异?
java - 有没有我们可以用来在二进制/字节代码级别比较两个罐子的工具?
这个想法是比较两个罐子,看看它们是否是从相同的源生成的,并比较它们在二进制/字节代码级别是否相同。此外,如果它们都使用相同的编译器编译,即 Eclipse JDT 或 JIT 等编译器。
我看过 Apache Common BCEL,但它只是在将原始字节码分解为源代码后进行比较,然后像 diff 工具一样进行比较;逐行比较文本,但我想要的是比较字节码而不被分解/重新排列为源代码,然后进行比较。
我正在研究如何比较直接的二进制/字节码比较!!!
免费工具/API 推荐会很好:) Ta
java - 如何用 Java 替换 XML?
我不了解使用 XML 存储设置、页面或 GUI 布局甚至 bean 集的全球时尚。
如果我们考虑到 XML 不是单一语言,而是定义多种语言的模板这一事实,那么大规模的疯狂就变得显而易见了。
为什么要使用数十种语言而不是使用一种?
例如,Java。
它可以定义或声明任何类型的 GUI 层次结构、设置表等。
那么我们为什么不使用java文件来存储所有的东西呢?
例如,可以提供如下 java 格式的设置文件:
该文件可以通过运行时编译器即时编译,并通过反射提取字段。
那么,我们为什么不这样做呢?
唯一想到的原因是安全性。
外部文件不仅可以包含属性,还可以包含一些构造函数代码,这可能会破坏应用程序或使其崩溃。
所以。这种情况有什么保护措施吗?我们可以限制运行时编译文件的可能功能吗?
更新
我的意思不是Java。Java 只是一个示例。我需要使用单一语言的方法。
更新 2
我声称,在整个项目方面使用一种单一语言会更好。
假设在 MVC 模式中,我们将为模型、视图和控制器使用三种不同的语言!这将是无稽之谈!我们使用单一语言。我的意思是我们人们使用不同的语言,但每个程序员都使用一种语言,但仍然分隔 MVC。这就是配置文件的含义:再分离一个概念。仅仅因为概念是分开的,使用不同的语言没有任何意义。
这也适用于 HTML / JavaScript / CSS。拥有三种语言是没有意义的。没有任何该死的感觉!
我当然理解历史原因等。但这些都是没有意义的,这些只是讨厌的原因。
那么,为什么我们会看到具有相同性质的新项目和新项目呢?
为什么 MS 为 WPF 创建 XAML?他们创造了新的新鲜的 C# 语言,为什么不把 XAML 也放进去呢?
Oracle 为什么要为 JavaFX 创建 FXML?感谢上帝,他们放弃了 JavaFX 脚本!因为他们只想为 RIA 提供三种语言!