在编译期间访问VM参数

时间:2013-01-25 11:26:35

标签: java jvm-arguments annotation-processing

我在访问My程序中的VM参数时遇到问题。我正在编写一个注释处理器,我想在其中访问一些VM参数。我正在使用NETBeans IDE。我创建了注释处理器的jar文件,然后在另一个带有注释的java文件的项目中使用它。

现在在我的注释处理器项目中,在IDE中我将VM参数设置如下

-Dname="hello from VM"

并在我尝试访问它时注释处理器的process()函数

String property = System.getProperty("name");

System.out.println(property);

它打印为null。 我们可以在编译期间访问这些VM参数由于注释处理器和带注释的类在同一个VM中运行吗? 感谢

3 个答案:

答案 0 :(得分:1)

我不知道从注释处理器访问系统属性的方法,但我认为注释处理器选项将支持您的用例。基本上,您希望在处理器中实现getSupportedOptions,通过processingEnv.getOptions访问选项,并使用-Aname=value在命令行上传递选项。也可以通过@SupportedOptions注释指定支持的选项。

答案 1 :(得分:0)

您可以使用javac将选项传递给运行-J的JVM,所以

-J-Dname="hello from VM"

可能会做你需要的。

答案 2 :(得分:0)

这适用于使用Java 1.8.0_05的Windows 8.1 x64下的Netbeans 8.0。我只能假设它最近被修复了。

    Messager cm = processingEnv.getMessager();
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        System.getProperties().storeToXML(baos, "System Properties");
    }
    catch (IOException ex) {
        cm.printMessage(Kind.ERROR, "Exception while getting System properties as XML: " + ex.getMessage());
    }
    cm.printMessage(Kind.NOTE, "\System.properties XML:\n" + baos.toString());

这会给我

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>System Properties</comment>
<entry key="java.runtime.name">Java(TM) SE Runtime Environment</entry>
<entry key="java.vm.vendor">Sun Microsystems Inc.</entry>
...
</properties>

jbunting (即使用processingEnv.getOptions())的anwser对于将键值对干净地传递给注释处理器来说肯定更为正确。