"Load" class based on string name, and access field values using string name

Viewed 208

I have successfully obtained the values of List field from another class using reflection. However, I can't use it if the field is of type List.

Here's my actual code:

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
    }
}

Even when I directly use List testElements = (List) obj; , the same error java.lang.reflect.Field cannot be cast to java.util.List is returned.

Thank you so much in advance.

1 Answers

You can get the list by using classname by making them as static.

Here, I have modified your code.

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
    }
}
Related