如何投入到未知类

时间:2016-12-03 20:38:36

标签: java class casting

我有一个班级:

public class Example {
    public String name; 
}

但是这个类不必被调用示例可能不同(例如Example2,AnotherExample我不知道如何),问题是我不知道如何调用。

在另一个类中,我有一个方法,它将参数列表作为参数。 我的示例类:

public class ObjectClass{
    public List<Object> doSomething(List<Object> objects) {
        for(int i = 0 ; i < objects.size();i++) {
            Class<?> c = objects.get(i).getClass();
            System.out.println("class name " + c.getCanonicalName());// i get name my class
            System.out.println(((Example) objects.get(i)).name);
        }
    }
}

当我将强制转换示例更改为另一个类System.out.println(((c) objects.get(i)).name);时 它没有用。

我的类可以自己调用不同,然后转换为Example将无效。 一般来说,我想获得名称的价值,而不知道如何命名类。但我选择具有字段名称的类(或通过具有注释)。 编辑:是一个问题,这是我的作业,我无法改变课程示例,我无法改变方法doSomething。

2 个答案:

答案 0 :(得分:0)

欢迎来到多态的奇妙世界。您可以这样做:

interface Named
{
    String getName();
}

public class Example implements Named
{
    public String name; 

    @Override
    public String getName()
    {
        return name;
    }
}

public class AnotherExample implements Named
{
    public String name; 

    @Override
    public String getName()
    {
        return name;
    }
}

然后你可以这样做:

        System.out.println(((Named) objects.get(i)).getName());

当然我还建议您执行以下操作:

public List<Named> doSomething(List<Named> objects) {

这样你就可以做到这一点:

        System.out.println(objects.get(i).getName());

澄清后编辑:

如果您无法添加自己的界面,请尝试以下方法:

Object foo = objects.get(i);
if( foo instanceof Example )
{
    Example example = (Example)foo;
    ...do something with example...
}
else if( foo instanceof AnotherExample )
{
    AnotherExample anotherExample = (AnotherExample)foo;
    ...do something with anotherExample...
}
else
{
    assert false; //I do not know what class this is.
}

答案 1 :(得分:0)

如果您专门查看字段名称,您还可以通过反射迭代所有字段并访问正确的字段。

public List<Object> doSomething(List<Object> objects) {
    for (int i = 0; i < objects.size(); i++) {
        Class<?> c = objects.get(i).getClass();
        for (Field field : c.getFields()) {
            if ("name".equals(field.getName())) {
                try {
                    System.out.println("class name " + c.getCanonicalName());// i get name my class
                    System.out.println(field.get(objects.get(i)));
                } catch (Exception e) {

                }
            }
        }
    }
    return null;
}