-3

大家好,我想知道如何使用字符串项目来调用一个类

class A {
    String[] des = { "hi" };
}

class Example {
    public static void main(String[] args) {
        String[] className = { "A", "B" };
        System.out.println(className.des[0]); // i wanted to call des array in
                                              // a class with index equal to 0
    }
}

从上面你可以解释我想要一个字符串内容在运行时用作类调用者。有没有可能..(我一定要使用字符串)

4

2 回答 2

1

您的代码没有多大意义,因为des不是Stringarray的字段className。但是,您似乎正试图访问A仅基于将类的名称作为String值而在类中声明的字段。由于des是一个实例字段,因此您需要一个实例A来使用。你可以这样做:

A a = (A) (Class.forName("A").newInstance());
System.out.println(a.des[0]);

您必须添加代码来处理这可能引发的潜在异常。另请注意,参数 toClass.forName需要是类的全名,所以如果A是包的一部分(比如com.example),那么它必须是Class.forName("com.example.A").

以下是如何将 Sotirios Delimanolis 和我的代码组合成一个完整的工作示例:

class Example {
    static class A {
        String[] des = { "Hi from class A" };
    }

    static class B {
        String[] des = { "Hi from Class B" };
    }

    public static void main(String[] args) {
        String[] classNames = { "Example$A", "Example$B" }; // inner class names
        for (String name : classNames) {
            try {
                System.out.println(getDes0(name));
            } catch (Exception e) {
                System.err.println("Could not get des[0] for class " + name);
                e.printStackTrace();
            }
        }
    }

    private static String getDes0(String className)
        throws Exception // better to be explicit, but distracts from the answer
    {
        Class<?> cls = Class.forName(className);
        Field field = cls.getDeclaredField("des");
        Object obj = cls.newInstance();
        String[] des = (String[]) field.get(obj);
        return des[0];
    }
}
于 2013-10-04T18:35:05.797 回答
0

使用 Ted Hopp 的解决方案。

我会后悔把这个给你看,但只是为了好玩

String className = "A"; // use the fully qualified name
Class clazz = Class.forName(className);
Field field = clazz.getDeclaredField("des");
field.setAccessible(true);
A a = new A(); // if you don't know the actual type, you can declare it as Object and get it from somewhere
String[] des = (String[])field.get(a);
System.out.println(des[0]);

显然,相应地进行所有异常处理。

于 2013-10-04T18:38:49.387 回答