转储或打印变量的名称

时间:2017-10-13 14:19:30

标签: java reflection

这个问题提到了xpaths,但它并不是特定于xpaths,而且确实与任何Java字符串有关。

我正在使用Java 8并且有大约40个字符串(类中的公共静态最终字符串)。一个例子如下:

int f = Convert.ToInt32(first);
int s = Convert.ToInt32(second);
BitArray bit = new BitArray(System.BitConverter.GetBytes(f & s));
Console.WriteLine(bit.Cast<bool>().Count(x => x));

还有一些更复杂的问题,比如

private static final String employeeID_x = "//input[@id = 'id']";
private static final String employeeName = "//input[@id = 'EmployeeName']";

等。其中有40个。我想验证所有的xpath,所以我做了一个类似

的数组
private static final String age_x = "//div[@id = 'Employee']/div[2]/span[1]";

然后验证

private static final String[] arr = {employeeID_x, employeeName_x, age_x, .....};

你明白了。这有效,但错误信息是 “// div [@id ='Employee'] / div [2] / span [1]不存在”。我想这没关系,但我宁愿让它说“age_x不存在”。

我不知道如何打印变量名称。我尝试过使用Class和getFields(),但这似乎不起作用。

我要做的是复制数组并将每个元素放在引号中,如下所示:

for (String xp: arr) {
    List<WebElement> eles = driver.findElement(By.xpath(xp));
    if (eles.size() == 0) {
        System.out.println(xp + " does not exist");
    }
 }

然后获取条目数并使用

private static final String[] names= {"employeeID_x", "employeeName_x", "age_x", .....};

但是你可以看到这可能会很痛苦。无论如何从xp获取名称?也许不,因为我担心它在创建数组时会替换每个字符串的值吗?

正如您所看到的,这不是特定于xpath的。

1 个答案:

答案 0 :(得分:0)

  

我不知道如何打印变量名。

使用当前数组,除非可以从字符串中推断出变量名,否则不能(合理地*)。这一行:

private static final String[] arr = {employeeID_x, employeeName_x, age_x, .....};

...将employeeID_x等的复制到数组中。该值与它所来自的变量之间没有持续的联系,就像在这段代码中一样:

a = b;

... ab之间没有正在进行的链接。

你的并行阵列解决方案有效,但正如你所说的那样并不理想。使用Map可能稍微好一些:

private static final Map<String, String> map = new HashMap<>();
static {
    map.put("employeeID_x", employeeID_x);
    map.put("employeeName_x", "employeeName_x);
    // ...
}

然后遍历地图的条目,这些条目为您提供名称和值。这仍然有一些重复(例如,在每个put调用中你必须输入两次变量名称),但从维护的角度来看它要好得多:显着更难以使两者不同步。

另一个选择是使用反射:你的数组将是变量的名称,然后你通过使用Class#getDeclaredField得到变量的值来获得Field实例,然后通过Field#get获取价值。例如,你的阵列将是:

private static final String[] arr = new String[] { "employeeID_x", "employeeName" /*, ...*/ };

...然后:

for (String name : names) {
    Field f = YourClass.class.getDeclaredField(name);
    String value = (String)f.get(null);
    // ...test `value` here, report `name` if there's a problem
}

*“合理地” - 您可以使用错误代码将字符串与每个字段进行比较并报告匹配,例如

if (theString.equals(employeeID_x)) {
    theVariableName = "employeeID_x";
} else if (theString.equals(employeeName_x)) {
    theVariableName = "employeeName_x";
} else if (...) {
    // ...

...但是... BLECH。 :-)(并假设其中两个永远不会有相同的值。)