我在访问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中运行吗? 感谢
答案 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对于将键值对干净地传递给注释处理器来说肯定更为正确。