“加载”类基于字符串名称,并使用字符串名称

时间:2017-09-29 05:58:38

标签: java selenium-webdriver reflection

我已经使用反射从另一个类成功获取了List字段的值。但是,如果字段是List类型,我就无法使用它。

这是我的实际代码:

class PageModel {
    @FindAll({ @FindBy(xpath = "//select") })
    public static List<WebElement> webelements;

    public static List<String> strings = Arrays.asList("One", "Two", "Three");
}

class Test {
    public static void main(String[] args) {
        Class model = Class.forName("PageModel");

        // List<String> sample
        obj = model.getField("strings").get(model);
        List<Object> testStrings = (List<Object>) obj;
        for (Object str : testStrings)
            System.out.print(str);

        // List<WebElement> sample
        obj = model.getField("webelements").get(model);
        List<Object> testElements = (List<Object>) obj;
        // java.lang.reflect.Field cannot be cast to java.util.List
    }
}

即使我直接使用List testElements =(List)obj; ,同样的错误java.lang.reflect.Field无法强制转换为java.util.List。

提前非常感谢你。

1 个答案:

答案 0 :(得分:0)

您可以使用classname将列表设为静态来获取列表。

在这里,我修改了你的代码。

public class MyGetter {
    sourceClass;

    public MyGetter(String sourceName) {
        sourceClass = Class.forName(sourceName);
    }

    public List<String> getField(String fieldName) {
        return new ArraysourceClass.getField(fieldName);
    }
}

public class Source1 {
    public static List<String> field1 = new ArrayList<String>(){{
        field1.add("field1Val");
    }};
}

public class Source2 {
    public static List<String> field2 = new ArrayList<String>(){{
        field2.add("field2Val");
    }};
}

public class Test {
    public void main(String[] args){
        MyGetter get1 = new MyGetter("Source1");
        System.out.println(get1.field1);
        // output: field1Val

        MyGetter get2 = new MyGetter("Source2");
        System.out.println(get2.field2);
        // output: field2Val
    }
}